0

我想在加载到 webview 之前检查某个 URL 的 HTTP 响应。如果http响应为200,我只想加载webview code。这是拦截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 错误的任何解决方法?谢谢

4

5 回答 5

4

android.os.NetworkOnMainThreadException每当您尝试直接在主 UI 线程上执行长时间运行的任务/进程时,就会发生这种情况。

要解决此问题,请将您的 Web 服务调用覆盖在AsyncTask. 仅供参考,Android 中的 AsyncTask 称为Painless Threading,这意味着开发人员无需担心线程管理。因此,使用 AsyncTask 实现 Web API 调用或任何长时间运行的任务,网络上有很多可用的示例。

更新:

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

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

于 2013-05-21T12:11:34.400 回答
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
    }
 }
于 2013-05-21T12:49:28.123 回答
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();
}
于 2013-05-21T12:17:47.650 回答
0

尝试在Async线程中执行此代码。

您可以从这里获得参考: 如何修复 android.os.NetworkOnMainThreadException?

于 2013-05-21T12:07:31.693 回答
0

不允许在主线程上执行网络请求。您必须使用不同的线程来发出此请求。您应该使用AsyncTask,例如看这里

于 2013-05-21T12:15:31.153 回答