2015-09-08 254 views
3

我使用的WebView與javascript界面​​有時當我在webView上呼叫loadUrlmWebView.getContext()返回nullView.getContext返回null,爲什麼?

  1. 視圖如何沒有上下文?爲什麼?
  2. 是一個視圖仍然使用或可重用的上下文嗎?
  3. 我的觀點沒有上下文時應該怎麼做?
  4. 最重要,如果視圖沒有上下文,是否會執行mWebView.post(new Runnable() { ...
  5. 該代碼是否相關?

    if (Looper.getMainLooper().getThread() == Thread.currentThread()) { 
        mWebView.loadUrl("javascript:..."); 
    } else { 
        mWebView.post(new Runnable() { 
         public void run() { 
          mWebView.loadUrl("javascript:..."); 
         } 
        }); 
    } 
    
+2

如果發生這種情況主要是因爲託管窗口小部件的活動/片段正在關閉 – Blackbelt

回答

10
一個空的上下文的

2常見的原因一個觀點:

  • 你正在試圖獲得異步回調調用上下文(處理器,網絡電話),但活動/片段由於用戶的另一個動作而消失(例如:被按下)。因此,視圖已經分離,並且已經沒有上下文了。

  • 你有一個內存泄漏的地方和兩個或更多的活動和視圖層次的實例。然後,在您不再提及的實例中發生了某些事情,但視圖已經失去與其上下文的鏈接。

關於處理程序。 我不確定視圖是否有自己的處理程序,或者它是否使用了它所附帶的Activity的處理程序,您可能需要閱讀源代碼才能找到。然而,這個問題並沒有真正的相關性:如果視圖沒有上下文,你就會遇到更大的問題:它不在屏幕上。

關於5.中的代碼是否相關,您需要回答以下問題:您爲什麼不知道代碼在哪個線程上運行?

當你知道你是哪個線程,並且如果它對你不在主線程中是有意義的,那麼使用處理程序是在main上執行代碼的有效方法。以及Activity.runOnUiThread()

只要記住Handler的生命週期不與活動相關聯。所以當你的活動/片段暫停時,你應該清除消息和可運行隊列

+0

感謝你的回答,可以檢查問題4和5? –

+0

如果我想在webview中做某些事情,但是mWebView.getContext()返回null,那麼片段會恢復並且操作未被觸發,如果您的視圖沒有上下文,則會在頁面中導致奇怪的狀態 –

+0

由於某種原因,它不在屏幕上。這就是你需要尋找的「某種原因」,並且webview可以正常工作 – znat