开发的程序在论坛反馈板块下,用户抱怨使用以后,手机发热量增加,耗电量也随之增加,在新版本发布之前,被要求排查程序源码中可能的原因。
根据每个页面访问的情况,初步确定问题出现的两个地方分别是有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,程序转入后台便不会占用那么多的资源了。