1. 程式人生 > >Android 徹底關閉WebView,防止WebView造成OOM

Android 徹底關閉WebView,防止WebView造成OOM

Android上的WebView經常會造成一些問題,我現在就遇到了 = =

關閉Activity之後,WebView還在記憶體中佔用,非常有可能造成OOM。但是即使在包含該webview的Activity的destroy()方法中,使用webview.destroy();webview=null;對記憶體佔回收用還是沒有任何效果。一旦在xml佈局中引用了webview甚至沒有使用過,都會阻礙重新進入Application之後對記憶體的gc。那麼怎麼徹底關閉WebView,我也是在網上找了好久 = =

第一種

WebView 動態載入。就是不在xml中寫WebView,寫一個layout,然後把WebView add進去。

WebView      mWebView = new WebView(getApplicationgContext());
LinearLayout mll      = findViewById(R.id.xxx);
mll.addView(mWebView);

然後:
protected void onDestroy() {
      super.onDestroy();
      mWebView.removeAllViews();
      mWebView.destroy()
}

這裡用的getApplicationContext()也是防止記憶體溢位,這種方法有一個問題。如果你需要在WebView中開啟連結或者你開啟的頁面帶有flash,獲得你的WebView想彈出一個dialog,都會導致從ApplicationContext到ActivityContext的強制型別轉換錯誤,從而導致你應用崩潰。這是因為在載入flash的時候,系統會首先把你的WebView作為父控制元件,然後在該控制元件上繪製flash,他想找一個Activity的Context來繪製他,但是你傳入的是ApplicationContext。然後就崩潰了。。。

第二種

用個反射,自己關掉

public void setConfigCallback(WindowManager windowManager) {
    try {
        Field field = WebView.class.getDeclaredField("mWebViewCore");
        field = field.getType().getDeclaredField("mBrowserFrame");
        field = field.getType().getDeclaredField("sConfigCallback");
        field.setAccessible(true);
        Object configCallback = field.get(null);
 
        if (null == configCallback) {
            return;
        }
 
        field = field.getType().getDeclaredField("mWindowManager");
        field.setAccessible(true);
        field.set(configCallback, windowManager);
    } catch(Exception e) {
    }
}

呼叫
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setConfigCallback((WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
}
 
public void onDestroy() {
    setConfigCallback(null);
    super.onDestroy();
}

缺點是,這個方法是依賴android.webkit implementation,android4.4之後就用chromium核心了,也就是4.4之後這個方法就不適用了。

第三種:為載入WebView的介面開啟新程序,在該頁面退出之後關閉這個程序。但是在這個其中,殺死自己程序的時候又遇到了問題,網上介紹的各種方法都不好使,killBackgroundProcesses(getPackageName());各種不好用,最後使用System.exit(0);直接退出虛擬機器(Android為每一個程序建立一個虛擬機器的)。一旦退出,記憶體裡面釋放。QQ也是這麼做。

-------------------------------------我是分割線-------------------------------------

在Chromium WebView的實現中,因為WebView不是基於SurfaceView類的(因為歷史遺留問題),所以,繪製內容到畫布上必須在主執行緒來操作。當從有WebView的Activity退出到沒有WebView的Activity,但是這個時候這個Activity需要繪製bitmap,就會造成崩潰:ELG繪製錯誤。

建議:儘量少使用getContext(),而使用getApplicationContext()來代替。

總結:目前比較好的方法是第三種,但是還沒有完美的方法,大家誰有,記得告訴我 = =

相關推薦

Android 徹底關閉WebView防止WebView造成OOM

Android上的WebView經常會造成一些問題,我現在就遇到了 = = 關閉Activity之後,WebView還在記憶體中佔用,非常有可能造成OOM。但是即使在包含該webview的Activi

shutdown徹底關閉tomcat以及多線程關閉

schedule kill context ice 最新版 java程序 周期 event 並且 最近做的一個Web項目,發現shutdown.sh後,無法關掉tomcat進程。   ps -ef | grep tomcat   返回tomcat進程仍然存在。經過調查發現是

android——徹底關閉——應用程式

最近學習做android的遊戲開發時候,發現一個關於android退出時不能徹底關閉的問題,比如:一個程式裡new 出了N多個Thread,這樣在退出程式的可能不能完全關閉,最後發現,只用finish()方法,有時候不能徹底退出,個人感覺還是要在適當的地方加上:Syste

Android Bitmap圖片處理防止記憶體溢位

在android 中載入一張圖片,如果圖片過大就有可能會出現記憶體溢位,特別是在載入資料過多的時候,像ListView 和GridView等重複列表中,因此在處理Android圖片防止記憶體溢位就顯得特別的重要,也是很多面試中經常問到的問題,面試官通常都會讓你談

Android關閉WebView滾動disable webView scroll

有效程式碼: // disable scroll on touch webview.setOnTouchListener(new View.OnTouchListener() { @

Android實現儲存圖片長圖、長佈局(webView等)

最近開發遇到一個問題,分享的時候 需要分享一個佈局內容,但是要用圖片分享的格式,最開始思考感覺不可能實現,手機上很少有功能可以實現長圖儲存的, 可是經理說,髮長微博的時候就是自動儲存的長圖片,頓時傻眼了,人家是怎麼做的呢??? 本已經放棄該功能,可這麼一說,又開始在網上找,並沒有很明確的找到

android中動態載入webviewwebview載入html資料並且隱藏滾動條

 ScrollView layouts = (ScrollView) findViewById(R.id.web); WebView webviews = new WebView(DtDetailActivity.this);webviews.setVisibility(

Android onDestroy防止WebView記憶體洩露的寫法

@Override protected void onDestroy() { if (mWebView != null) { mWebView.loadD

android-Webview】設定多個cookie實現webview中儲存登入資訊

方法:通過重複呼叫 cookieManager.setCookie(url,cookie1); 來儲存多個cookie。 程式碼: /** * Sync Cookie */ private void syncCookie(Context

Android菜鳥學習筆記(WebView載入html頁面頁面提交資料問題)

在開發過程中,有一個問卷調查功能,問卷是url用webView載入html頁面出來,在html頁面提交時發現session沒和webview的同步導致提交失敗,這個問題困擾了我很久,後來在前輩的共同研究下,終於找到辦法:獲取html頁面提交的url,然後對url做一次coo

登山-C#-關於TcpListener的AcceptTcpClient()方法造成執行緒阻塞進而程式無法徹底關閉的問題

在《C#高階程式設計》第7版第24章,有提到使用TCP類。 書中寫了一個例項,兩個winform,其中一個點選按鈕傳送字串,另一個winform進行接收。這個例項有個缺點,只能接收一次。 我將這個例項進行了改造。第一版做好後,可以進行接收和傳送,但是出現一個問題,就是在關閉

AndroidWebView防止呼叫系統瀏覽器開啟頁面 看了好多朋友寫的程式碼我在整理了

自己學習android,經常遇到一些坑,明明其他窗體可以正常在應用內開啟,只是複製了寫過的程式碼,就一直在外部瀏覽器開啟,看了好多文章,總算找到了一些方法     private WebView mWebView = null; private Act

關於Android原生整合5+webview監聽webview返回時執行兩次onkey方法問題的解決

 setOnKeyListener之所以執行兩次是因為都down和up佔用了,解決方法是KeyEvent.getAction()==KeyEvent.ACTION_DOWN或者KeyEvent.getAction()==KeyEvent.ACTION_UP的時候讓他執行re

Android】自定義帶進度條的WebView修復不彈出軟鍵盤的BUG

記錄下最近開發中研究的帶進度條的WebView 自定義類吧。 其實網上有不少這樣的帖子,但是都沒有一個完整的好用的例子,最關鍵的是,用網上的例子後有一個很明顯的bug,就是遇到輸入框的話沒法彈出軟鍵盤。研究了好久總算搞定了。特此記錄下。 直接上原始碼,關於程式碼的解釋,個人

vue中的方法如何暴露給webview使安卓和iOS可以調用

js文件 class img blog 暴露 分享 images 技術 pan 新建一個外部公共的js文件app.js,定義一個對象並輸出,如下: var hybrid = { } window.Hybrid = hybrid if (window.Vue) { //

Android通過Chrome Inspect調試WebView的H5 App出現空白頁面的解決方法(不需要FQ)

為什麽 5.1 什麽 方法 下載 進行 htm ron 2.0 調試基於WebView的Hybrid App最舒服的工具當然是Chrome自帶的開發者工具,其中有我們熟悉的Dom樹調試,JS調試,Network監視等等功能。 Google提供的調試Android上WebV

如何直接打開android系統的wifi設置頁面防止intent劫持

art intent pre fonts mark bsp androi 希望 andro 在android的app開發中,經常會遇到需要跳轉至系統設置頁面的需求。但是當你使用以下代碼時: 如 Intent intent = new Intent(Settings.ACT

linux環境中關閉tomcat通過shutdown.sh無法徹底關閉--線程池

text str 網上 問題思路 綜合 pri src size ==   最近測試環境上測試的項目通過shutdown.sh始終無法徹底關閉。   之前臨時解決方法兩種:   第一:通過ps -ef|grep tomcat查看到tomcat的進程直接使用kill來殺死進程

Android開發中ScollView嵌套 WebView底部高度無法自適應解決

hbase get ride web algorithm 接口 試驗 splay 網頁加載 最近要做一個頁面,需要 ScrollView 嵌套 WebView,怎麽嵌套,怎麽解決焦點和 touch 事件沖突,網上一大堆,這裏就不贅述了,但是發現 WebView 從一個高度很

Android升級到7.0使得webview載入頁面為空白頁

        前段時間,公司一哥們把他的手機拿給我看,問到公司的軟體載入進去是空白頁,等了好久也是空白。我也為是網路出現了問題,排查沒問題啊。看看是不是快取問題,又是清快取,又是解除安裝重灌。結果還是空白頁面。想了一下是不是