E / HttpHandler:异常:null

时间:2017-04-10 06:03:48

标签: android

我从Tutorialspoint复制了此内容,似乎对我不起作用。

我有错误 E / HttpHandler:例外:null

import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class HttpHandler {

    private static final String TAG = HttpHandler.class.getSimpleName();

    public HttpHandler() {
    }

    public String makeServiceCall(String reqUrl) {
        String response = null;
        try {
            URL url = new URL(reqUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            // read the response
            InputStream in = new BufferedInputStream(conn.getInputStream());
            response = convertStreamToString(in);
        } catch (MalformedURLException e) {
            Log.e(TAG, "MalformedURLException: " + e.getMessage());
        } catch (ProtocolException e) {
            Log.e(TAG, "ProtocolException: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "IOException: " + e.getMessage());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
        return response;
    }

    private String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }
}

我相信这个脚本基本上会检查连接,我做了以下

HttpHandler sh = new HttpHandler();
    // Making a request to url and getting response
    String url = "http://api.androidhive.info/contacts/";
    String jsonStr = sh.makeServiceCall(url);

    if(jsonStr != null) {
        System.out.println("success");
    } else {
        System.out.println("failed");
    }

我检查了网址,似乎可以访问。我不知道导致错误的原因。另外,我在Manifest中添加了INTERNET权限。

对于日志

android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:425)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:259)
    at java.net.InetAddress.getAllByName(InetAddress.java:221)
    at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:278)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:216)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:391)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:341)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199)
    at com.techdepot_ph.maco.iannounce.HttpHandler.makeServiceCall(HttpHandler.java:33)
    at com.techdepot_ph.maco.iannounce.SettingsFragment.syncdata(SettingsFragment.java:182)
    at com.techdepot_ph.maco.iannounce.SettingsFragment$5$1.onClick(SettingsFragment.java:151)
    at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5847)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1010)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
failed

2 个答案:

答案 0 :(得分:1)

您正在进行此调用的代码部分位于主线程上。您不能从主线程进行网络呼叫。

尝试将代码更改为:

new Thread(new Runnable() {
    HttpHandler sh = new HttpHandler();
    // Making a request to url and getting response
    String url = "http://api.androidhive.info/contacts/";
    String jsonStr = sh.makeServiceCall(url);

    if(jsonStr != null) {
        System.out.println("success");
    } else {
        System.out.println("failed");
    }
}).start();

您还可以使用辅助类,例如AsyncTask。在此处阅读有关多线程的更多信息:Processes and Threads | Android Developers

答案 1 :(得分:1)

我测试了你的代码。它工作正常,但你正在做的一个愚蠢的错误,你从主线程调用Web服务。

NetworkOnMainThreadException

用以下代码替换您的代码:

new AsyncTask<Void, Void, String>()
        {
            ProgressDialog progressDialog;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();

                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setCancelable(true);
                progressDialog.show();
            }

            @Override
            protected String doInBackground(Void... params)
            {

                HttpHandler sh = new HttpHandler();
                // Making a request to url and getting response
                String url = "http://api.androidhive.info/contacts/";
                String jsonStr = sh.makeServiceCall(url);

                if(jsonStr != null) {
                    System.out.println("success");
                } else {
                    System.out.println("failed");
                }

                return jsonStr;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                progressDialog.dismiss();

                System.out.println("result=="+result);
            }
        }.execute();