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,程序转入后台便不会占用那么多的资源了。

时间: 2024-10-30 02:08:15

Android开发中使用WebView后程序进入后台依旧占用CPU的解决的相关文章

Android开发中使用WebView控件浏览网页的方法详解

本文实例讲述了Android开发中使用WebView控件浏览网页的方法.分享给大家供大家参考,具体如下: 项目中遇到数学展示问题,常规的Textview显示处理不了数学公式,利用图片生成对服务器又产生较大压力,经过查询,可以通过webview加载JS实现.IOS同样的方法也可实现,但JS渲染效率远高于安卓.对Webview做下总结. 1.WebView 在使用WebView控件时,首先需要在xml布局文件中定义一个WebView控件,定义的方法如下: <WebView android:id=&quo

android开发中webview保存cookie问题的解决

最近老是发现在IE里会有Cookie的问题,如IE下面无法登出,或无法登录,或者登录后信息却无法取到,而Firefox下面一直是通过的,都试过好多次了,今天终于找回的主要的原因: Cookie的问题: 首先看一下我的Cookie存取代码 (这个Cookie操作支持二级域名访问) #region 存取Cookie /// 〈summary〉 /// 存Cookie /// Json Lee 2007-09-24 /// 〈/summary〉 /// 〈param name="strName&quo

Android开发之开门狗在程序锁中的应用实例_Android

本文实例讲述了Android开发之开门狗在程序锁中的应用方法.分享给大家供大家参考,具体如下: protected static final String TAG = "WatchDogService"; private AppLockDao dao; private List<String> lockApps; private ActivityManager am; private Intent lockappintent; @Override public IBinde

Android开发中应用程序分享功能实例_Android

本文实例讲述了Android开发中应用程序分享功能.分享给大家供大家参考,具体如下: Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); //设置类型 shareIntent.setType("text/plain"); //设置分享的主题 shareIntent.putExtra("android.intent.extra.SUBJECT", "分享&

Android开发中应用程序分享功能实例

本文实例讲述了Android开发中应用程序分享功能.分享给大家供大家参考,具体如下: Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); //设置类型 shareIntent.setType("text/plain"); //设置分享的主题 shareIntent.putExtra("android.intent.extra.SUBJECT", "分享&

Android开发中使用SQLite 数据库

SQPte 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 SQPte. SQPte 由以下几个组件组成:SQL 编译器.内核.后端以及附件.SQPte 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展 SQPte 的内核变得更加方便. 图 1. SQPte 内部结构 开发中使用SQLite 数据库-android sqlite数据库"&g

在Android开发中替换资源图片不起作用的解决方法_Android

现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是使用的是原来的资源图片. 原因 在开发过程中,由于使用模拟器测试了程序,在首次运行后会将res文件夹下的图片资源文件(如drawable-hdpi.drawable-ldpi和drawable-mdpi)拷贝到bin文件夹下.在替换资源图片后,eclipse并不清楚是否有图片改变,所以会使用原来bi

Android开发中Activity属性设置小结_Android

Activity是Android组件中最基本也是最为常见用的四大组件之一,在 android开发中 ,运用极为广泛,作为初学者需要熟练掌握,下例为Activity属性常用设置. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务. android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态 android:clearTaskOn

Android开发中Eclipse报错及对应处理方法总结_Android

本文较为详细的总结了Android开发中Eclipse报错及对应处理方法.分享给大家供大家参考,具体如下: 报错1: Conversion to Dalvik format failed with error 1 报错原因:原因是我在android工程中不小心多导入Java的mina,结果一跑程序就报这个错误. 解决方法:将Java中用到的mina包移除,就OK了. 小结:以后遇到这种报错时,记得提醒自己可能是由于自己导错包了. 附: 网上其他处理方法:<丢失Android系统库或者Conver