Android中的HTTP响应 - NetworkOnMainThreadException

时间:2013-05-21 12:05:19

标签: android android-webview httpresponse

我想在加载到webview之前检查某个URL的HTTP响应。如果http响应code为200,我只想加载webview。这是拦截http错误的一种解决方法。我在下面:

HttpGet httpRequest = new HttpGet( "http://example.com");
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(httpRequest);
int code = response.getStatusLine().getStatusCode();

但是我遇到了以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo
android.os.NetworkOnMainThreadException

如何解决?或者在webview中解决http错误的任何解决方法?感谢

5 个答案:

答案 0 :(得分:4)

每当您尝试直接在主UI线程上执行长时间运行的任务/进程时,就会出现

android.os.NetworkOnMainThreadException

要解决此问题,请在AsyncTask内填写您的网络服务电话。仅供参考,在Android中称为Painless Threading的AsyncTask,这意味着开发人员无需担心线程管理。因此,使用AsyncTask Go并实现Web API调用或任何长时间运行的任务,网上有大量示例。

更新

  

如果http响应代码为200,我只想加载webview。

=>根据您的要求,我会说在doInBackground()方法中包含您的代码并返回状态代码值,您可以在onPostExecute()内查看。现在,您将获得状态代码值200/201,然后您可以加载WebView。

答案 1 :(得分:3)

class HTTPRequest extends AsyncTask<int, Void, void> {



    protected int doInBackground() {
        try {
            HttpGet httpRequest = new HttpGet( "http://example.com");
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httpRequest);
            int code = response.getStatusLine().getStatusCode();
            return code;
        } catch (Exception e) {
           e.printstacktrace();

        }
    }

    protected void onPostExecute(int code) {
        // TODO: check this.exception 
        // retrieve your 'code' here
    }
 }

答案 2 :(得分:1)

您正在获得此异常,因为您正在UI线程中进行大量计算,即访问网络。

你永远不应该这样做。

相反,您可以将此代码移动到后台Java线程: 试试:

private void doNetworkCompuation()
{
 new Thread(new Runnable() {

            @Override
            public void run() {

HttpGet httpRequest = new HttpGet( "http://example.com");

HttpClient httpclient = new DefaultHttpClient();

HttpResponse response = httpclient.execute(httpRequest);

int code = response.getStatusLine().getStatusCode();

}).start();
}

答案 3 :(得分:0)

尝试在Async主题中执行此代码。

您可以从这里获得参考: How to fix android.os.NetworkOnMainThreadException?

答案 4 :(得分:0)

您不能在主线程上执行网络请求。您必须使用其他线程来发出此请求。您应该使用AsyncTask,例如here