在我的应用程序中,我加载了一个 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");
}
}
}
}