ユーザーがアプリケーションWebView
内でログインできるようにしようとしDialogPreference
ていますが、これは正常に機能しますが、これを適切に行う方法に行き詰まっているようです。
これを次のようにすると、エラーが発生します
エラー
Caused by: android.os.NetworkOnMainThreadException
E/AndroidRuntime(732): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
コード
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
this.webViewOauth = (WebView) v.findViewById(R.id.web_oauth);
try {
String authURL = this.backend.getRequestToken().getAuthenticationURL();
webViewOauth.loadUrl(authURL);
}
catch (TwitterException e) {
e.printStackTrace();
}
}
を変更することでこれを修正できますThreadPolicy
が、私が知る限り、この制限には理由があります
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
だから、これをに切り替えてAsyncTask
、警告が表示されます
警告
java.lang.Throwable: 警告: スレッド 'AsyncTask #4' で WebView メソッドが呼び出されました。すべての WebView メソッドは、UI スレッドで呼び出す必要があります。WebView の将来のバージョンでは、他のスレッドでの使用がサポートされなくなる可能性があります。
コード
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
MyLoginTask login = new MyLoginTask(this, v, this.backend);
login.execute();
}
どちらの方法も機能しますが、これを適切に行う特定の方法はありますか? これはハックのThreadPolicy
ようで、UI スレッドをブロックする可能性がありますが、実際にブロックされるかどうかはわかりませんがAsyncTask
、警告に基づいてメソッドも明らかに正しくありません。
ThreadPolicy
実際に UI 要素を実行しているので、これはを設定する適切なタイミングですか?