5

Web ビューを含むアプリを開発しています。アプリの特定の時間に、Webview loadUrl への呼び出しを行います。

呼び出しは、UI スレッドのイベントから直接発生する場合もあれば、バックグラウンド ワーカー スレッドのイベントから発生する場合もあります。バックグラウンド スレッドから発生した場合は、runOnUIThead() を呼び出して、loadURL への実際の呼び出しが UI スレッドで発生するようにします。

私が経験しているのは、loadUrl() が UI スレッドから発信された場合は正常に動作しますが、ワーカー スレッドから発信された場合は機能しません (loadUrl への実際の呼び出しは runOnUIThread() に渡すランナブルを介して行われます)。

ブレーク ポイントを設定すると、両方のインスタンスで loadUrl() が UI スレッドで呼び出されていることがわかります。それでも、ある場合には機能しますが、他の場合には機能しません。

私は現在、Android Webview のソース コードをふるいにかけ、機能する場合と機能しない場合がある理由を追跡できるかどうかを確認しています。誰かがこの問題に光を当てることができれば、それは大歓迎です。

- - アップデート - -

この投稿からいくつかの提案を試しました: WebView loadUrl works only once

loadUrl を呼び出す前に、主に次のことを行います。

webView.clearCache(true);
webView.loadUrl("Url");

と:

webView.clearCache(true);
webView.clearView();
webView.reload();
webView.loadUrl("about:blank");
webView.loadUrl("Url");

残念ながら、どちらも機能しません。

4

1 に答える 1

2

一般に、メイン スレッドの外でビューを作成するのは安全ではありません。

あなたの特定のケースでは、WebView は UI スレッドとの通信のためにコンストラクターで Handler() を作成するため、これは許可されません。しかし、ハンドラーのデフォルトのコンストラクターは現在のスレッドにアタッチされており、現在のスレッドではルーパーが実行されていないため、この例外が発生しています。

ルーパー スレッド (少なくとも WebView の間は存続している必要があります) を作成すると役立つと思うかもしれませんが、これは実際には危険な方法です。そして、私はそれをお勧めしません。

メインスレッドで WebView を作成することに固執する必要があります。すべてのコントロールは、ほとんどの場合 UI スレッドで作成されるため、通常、迅速な構築のために最適化されています。

または、このようにwebviewを呼び出すことができます

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                //    your webview method

            }
        });
于 2014-08-27T10:19:45.967 に答える