閱讀81 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android開發中使用WebView後程序進入後台依舊占用CPU的解決

開發的程序在論壇反饋板塊下,用戶抱怨使用以後,手機發熱量增加,耗電量也隨之增加,在新版本發布之前,被要求排查程序源碼中可能的原因。

根據每個頁麵訪問的情況,初步確定問題出現的兩個地方分別是有admob的列表頁、使用webview顯示網頁的頁麵;初步分析帶有admob的列表頁可能的原因是進入後台以後,雖然onPause()處理了事件,但是admob還是依舊運行中,所以出現了轉入後台依舊高CPU消耗的問題。這裏嚐試了解決方案是在onPause()中銷毀了admob的廣告,當onResume()時重新獲取廣告。測試這裏問題解決。

在webview中的問題就麻煩了許多,開始測試時,試用webview的stopLoading(),發現完全沒有達到預想的效果,由於請求的是服務器端的網頁展示,考慮會不會是頁麵的問題,最終這個原因也被排除。後來經過多次嚐試,發現在DDMS中查看進程時發現,每當啟動了webview以後,WebViewCoreThread便會一直運行,觀察這個線程的運行時間,可以很明顯的看出來不管程序是在前台運行狀態還是後台狀態,它都在正常運行,導致了CPU和內存占用居高不下。

既然找到了源頭,接下來便是尋求處理方法。終於找打一個可以解決的辦法,經測試該方法在2.2, 2.3, 4.1.2真機上效果是可以的,現整理一下。

我們需要自己寫一個WebView控件,繼承係統的WebView:

packagecom.ilovn.app.test;
 
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.webkit.WebView;
 
/**
 * 自定義的WebView
 *
 * @author zhaoyong
 *
 */
publicclass FastWebView extendsWebView {
    privateboolean is_gone = false;
 
    publicFastWebView(Context context) {
        super(context);
    }
 
    publicFastWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    protectedvoid onWindowVisibilityChanged(intvisibility) {
        super.onWindowVisibilityChanged(visibility);
        if(visibility == View.GONE) {
            try{
                WebView.class.getMethod("onPause").invoke(this);// stop flash
            }catch(Exception e) {
            }
            this.pauseTimers();
            this.is_gone = true;
        }elseif (visibility == View.VISIBLE) {
            try{
                WebView.class.getMethod("onResume").invoke(this);// resume flash
            }catch(Exception e) {
            }
            this.resumeTimers();
            this.is_gone = false;
        }
    }
 
    @Override
    protectedvoid onDetachedFromWindow() {
        if(this.is_gone) {
            try{
                this.destroy();
            }catch(Exception e) {
            }
        }
    }
 
}

 

以後在使用的時候隻要都是用這個自定義的WebView,程序轉入後台便不會占用那麼多的資源了。


最後更新:2017-04-03 12:55:47

  上一篇:go android.widget.RadioButton 單選按鈕
  下一篇:go Android WebView Memory Leak WebView內存泄漏