0

ユーザーがアプリケーション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 要素を実行しているので、これはを設定する適切なタイミングですか?

4

1 に答える 1