我想在加载到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错误的任何解决方法?感谢
答案 0 :(得分:4)
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。