12

のサブクラスではWebView、オーバーライドされたメソッドにgetTitle()次の行がありました。

String title = super.getTitle();

Android 4.1携帯電話でアプリをテストするまで、 Androidのすべてのバージョンで問題なく動作し、その行に次の警告が表示されました。super.getTitle()

12-20 21:38:27.467: W/webview_proxy(2537): java.lang.Throwable: 警告: スレッド 'WebViewCoreThread' で WebView メソッドが呼び出されました。 すべての WebView メソッドは、UI スレッドで呼び出す必要があります。WebView の将来のバージョンでは、他のスレッドでの使用がサポートされなくなる可能性があります。

それで、私はこの新しい法令を通過させることで回避することを考えていましたrunOnUiThread():

Activity a = this.getActivity();
a.runOnUiThread(new Runnable() {
    public void run() { 
    String title = super.getTitle();
    }
});

しかし、このコードは を参照するのではなく をsuper参照するため、コンパイルさえできません。WebViewActivity

super.getTitle()UIスレッドからの方法はありますか? (上記の制約getTitle()により、 のサブクラスのWebView)

4

4 に答える 4

6

Morgan's answerは、コンパイル エラーを修正する可能性がありますが、実際にはこの問題の解決策ではありません。

まず第一にgetTitle()、別のスレッドへの呼び出しを変更しても何もしません。その根底にある問題が、Android が実行時にエラーを出す理由です。

あなたはコメントで言う

状況は、たまたま UI スレッド上にない WebViewClient.onPageFinished() で呼び出していることです。

それは問題かもしれません。UI スレッドから Web リクエストを開始している場合は、onPageFinished()必ず UI スレッドでコールバックする必要があります。Web リクエストをどのように開始しているのか、またなぜそのようにしているのか説明できますか? ほとんどの場合onPageFinished()、バックグラウンドで呼び出されることはないはずなので、別の場所で問題が発生している可能性があります。

WebView.loadUrl()(注: UI のブロックを回避するためにバックグラウンドで呼び出す必要があると思われる場合は、その問題に関するこの他の回答を参照してください)

バックグラウンドで Web リクエストを開始する必要があると本当に思っていて、バックグラウンドで呼び出されていることがわかった場合は、UI スレッドでonPageFinished()呼び出すように注意する必要があります。getTitle()

また、メソッドから呼び出す場合はonPageFinished()、次のような構文を使用する必要はありません。

String title = MyWebView.this.getTitle();

そのメソッドでは、Web ビューのインスタンスが渡されるので、それを直接使用してください。

public void onPageFinished (WebView view, String url) {
    String title = view.getTitle();
}

しかし、私が言ったように、それはスレッド化の問題に対処していません。そのメソッドでページ タイトルを使用しようとしている理由を示す必要がありますが、安全に使用する1 つの方法は次のようになります。

public void onPageFinished (final WebView view, String url) {
   view.post(new Runnable() {
      public void run() { 
         String title = view.getTitle();
         // do something with title that affects the UI here
      }
   });     
}

上記のコードで viewパラメーターを作成する必要があることに注意してください。final

于 2013-01-01T22:46:10.333 に答える
5

あなたの質問に対する直接的な答えはありませんが、同様の問題に遭遇したときにうまくいった回避策を提案できます: 呼び出すメソッドを呼び出すメソッドを見つけて、runOnUiThread()経由String title = super.getTitle();で実行ます。

HTH。

于 2012-12-24T00:01:14.263 に答える
2

直接的な解決策はこれを行うことです

String title = MyWebView.this.getTitle();

それ以外の

String title = super.getTitle();

そうは言っても、これを呼び出している状況 (つまり、バックグラウンドで呼び出している理由) について詳しく知ることは興味深いでしょう。私が言及したコードを変更した後でも、あなたのアプローチがあなたの望むことをするかどうかわからないので、私は尋ねます。

于 2013-01-01T18:07:59.257 に答える
0

この警告を取り除くには、次の手順を実行します。

  Handler handler =new Handler();
    handler.post(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            String URL = "http://www.superlinux.net";

            //Of course the object "webview" is a WebView. 
            //it's better to define it a global variable
            webview.loadUrl(URL);
        }
    });

したがって、この方法を使用すると、webview は UI 要素であるため、Handler オブジェクトを使用します。ハンドラーは、UI 要素の作成とは別に実行されるある種のスレッドです。

于 2013-03-31T09:33:33.417 に答える