簡體   English   中英

來自工作線程時,Android Webview loadUrl不起作用

[英]Android Webview loadUrl does not work when coming from a worker thread

我正在開發一個包含Web視圖的應用程序。 在應用程序中的某些時候,它會調用Webview loadUrl。

有時,調用將直接來自UI線程上的事件,有時則來自后台工作線程上的事件。 當它來自后台線程時,我調用runOnUIThead()以確保在UI線程上發生對loadURL的實際調用。

我遇到的是loadUrl()在源自UI線程時工作正常,但是當它來自工作線程時它無法工作(即使實際調用loadUrl是通過runnable發送到runOnUIThread())。

設置了一個斷點后,我可以看到在兩個實例中都在UI線程上調用了loadUrl()。 然而,它適用於一個案例但不適用於另一個案例。

我目前正在篩選Android Webview源代碼,看看我是否可以找到有時它有效的原因,有時它不會。 如果有人能夠對此事有任何啟示,我們將不勝感激。

---更新---

我在這篇文章中嘗試了一些建議: WebView loadUrl只能工作一次

在調用loadUrl之前主要執行以下操作:

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

和:

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

不幸的是他們都沒有工作。

通常,在主線程之外創建視圖是不安全的。

在您的特定情況下,這是不允許的,因為WebView在其構造函數中創建Handler()以與UI線程進行通信。 但是由於Handler的默認構造函數將自身附加到當前線程,並且當前線程沒有運行Looper,因此您將獲得此異常。

您可能認為創建一個looper線程(必須至少與WebView一樣長)可能對您有所幫助,但這實際上是一種冒險的方法。 我不推薦它。

你應該堅持在主線程中創建WebViews。 所有控件通常都針對快速構造進行了優化,因為它們幾乎總是在UI線程中創建。

或者您可以像這樣調用webview

runOnUiThread(new Runnable() {

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

            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM