在我的应用程序中,我加载了一个webview(登录表单),它将我重定向到实际的登录表单,然后我将在同一webview中显示。这个webview是从我的onCreateView调用的,
new FetchLoginFormTask().execute();
但是,我间歇性地注意到android.os.NetworkOnMainThreadException,这让我觉得webView.loadUrl()方法导致了这个问题。我无法一直重现这一点,所以,我在onPostExecute()中创建了一个Asynctask,但我注意到在logcat中我无法从另一个asynctask中调用webview。我有什么选择可以确保登录表单加载时没有任何ANR或我缺少哪些最佳实践?
private class FetchLoginFormTask extends AsyncTask<String, Integer, Response> {
@Override
protected void onPreExecute() {
}
@Override
protected Response doInBackground(String... params) {
int paramLen = params.length;
Response result = MyOAuth.fetchLoginForm();
return result;
}
@Override
protected void onProgressUpdate(Integer... progress) {
}
@Override
protected void onPostExecute(Response result) {
if (result != null) {
//in case of redirect
if (result.getCode() == 302) {
Log.i(TAG, "Response was redirect: " + result.getCode());
//TODO: isn't this a network operation on main UI thread?
webView.loadUrl(result.getHeader("Location"));
} else {
String html = result.getBody();
webView.loadData(html, "text/html", "UTF-8");
}
}
}
}