【问题标题】:E/HttpHandler: Exception: null [duplicate]E/HttpHandler:异常:null [重复]
【发布时间】:2017-09-05 01:44:10
【问题描述】:

我从Tutorialspoint 复制了这个,它似乎对我不起作用。

我遇到了错误E/HttpHandler: Exception: 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");
    }

我检查了 URL,它似乎可以访问。我不知道是什么导致了错误。另外,我在 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

【问题讨论】:

  • 您是否在MANIFEST 文件中添加了INTERNET 权限?如果是,请检查您的互联网是否正常。
  • 如果能贴出日志,调试起来会更方便。
  • @VishalChhodwani 是的,我做到了。
  • 尝试将Log.e(TAG, "Exception: " + e.getMessage()); 替换为e.printStackTrace() 以获取日志中的更多信息并在此处更新日志。
  • @KamranAhmed 请重新检查

标签: android


【解决方案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

【讨论】:

    【解决方案2】:

    我测试了您的代码。它工作正常,但是您正在做一个愚蠢的错误,即您从主线程调用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多