2015-05-27 58 views
1

這是我的Android應用程序(我們的內部延伸的WebView類)添加JSInterface到網頁視圖:的Android - JavaScript接口,與指針的WebView - 如何才達到它沒有memleak

addJavascriptInterface(new JSInterface(this), "appBridge"); // 'this' is MyWebView that we are inside 

然後構造JSInterface店'this'給他的受保護變量,因爲JSInterface方法需要訪問WebView類。

但是這種方式似乎導致內存泄漏。 MyWebView(以編程方式創建)具有指向JSInterface(addJavascriptInterface)的指針,並且JSInterface具有指向WebView的指針。所以垃圾收集器不能從內存中刪除它們。我對嗎?

回答

2

WebView將保存您的對象(JSInterface的實例),直到您撥打removeJavascriptInterface("appBridge")並重新加載您的頁面。

但是這種循環引用實際上並不是一個mark-compact收集器的問題(用於內置垃圾收集的語言,比如Java或JavaScript),因爲一旦這樣的循環構造沒有從外部(也就是你已經消除了你的最後一個引用的WebView實例)的引用,它會被收集爲不可達:

app ---> WebView --> JSInterface | both WebView and JSInterface are reachable 
     ^   | 
      -------------- 

    /
app -/-> WebView --> JSInterface | now this looped construction 
    / ^   |   | is unreachable and will be collected 
      -------------- 

你可能有引用計數(這往往是在語言中使用的類似混淆這C++),其中確實從一個對象到另一個對象的相互困難引用將導致它們永遠保留下來。

另外還有一個提示 - 如果你關心你的內存使用情況,不要忘了一旦你不需要它就調用WebView.destroy(),並且從視圖層次結構中刪除它以釋放本機代碼使用的資源。

+0

謝謝!這是我需要的。 – ElSajko

0

添加類似

jsInterface.setWebview(null); 

您的活動的onDestroy()的內部或通過您的WebView在方法的參數,而不是使用類字段。

+0

但是沒有任何保證,onDestroy將被調用。 – ElSajko

+0

如果onDestroy沒有被調用,你的webview不能被髮布... –

+0

否則,傳遞你的webview的方法參數,而不是使用類字段。 –