私のアプリでは、Web ビュー (ログイン フォーム) をロードして、実際のログイン フォームにリダイレクトし、同じ Web ビューに表示します。この 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");
}
}
}
}