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:
package com.ilovn.app.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.WebView;
/**
*
自定義的WebView
*
*
@author zhaoyong
*
*/
public class
FastWebView extends WebView
{
private boolean
is_gone = false ;
public FastWebView(Context
context) {
super (context);
}
public FastWebView(Context
context, AttributeSet attrs) {
super (context,
attrs);
}
@Override
protected void
onWindowVisibilityChanged( int visibility)
{
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 ;
} else if
(visibility == View.VISIBLE) {
try {
WebView. class .getMethod( "onResume" ).invoke( this ); //
resume flash
} catch (Exception
e) {
}
this .resumeTimers();
this .is_gone
= false ;
}
}
@Override
protected void
onDetachedFromWindow() {
if ( this .is_gone)
{
try {
this .destroy();
} catch (Exception
e) {
}
}
}
}
|
以後在使用的時候隻要都是用這個自定義的WebView,程序轉入後台便不會占用那麼多的資源了。
最後更新:2017-04-03 12:55:47