您的位置:首页 > 移动开发

WebView导致程序崩溃!!!

2012-12-20 18:05 148 查看
1. 项目中遇到一个问题,在一个webview的页面上长按,弹出系统的“复制”和“搜索”,点击“搜索”,程序死机,报错启动外部Activity时要设置一个 FLAG_ACTIVITY_NEW_TASK
,但是搜索启动的是系统的浏览器,我根本就没有startActivity ,找了半天,找到有个哥们跟我遇到了同一个问题 ,见链接:http://hi.baidu.com/cenxcen/item/8ba7a0f3715e3310ce9f32c1

我写的就是下面这段代码,R.layout.sub_xeb_webview中含有一个webview

for (int i = 0; i < items.size(); i++) {

View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.sub_xeb_webview, null);

mListPagerViews.add(view);

}

getApplicationContext() 导致的,网络上那么多神人说,用getApplicationContext()代替this ,可以优化内存,我上次就是出于这个想法就使用了它,结果内存真的不增加了,很有效果,所以我这里也用了万能的getApplicationContext() ,但这个东西是悲剧的开始,确实很坑爹,不要随便乱用哦,要在理解的基础上使用。

getApplicationContext()改成this后,点击“搜索”,不在挂机了。但是这样会产生另外一个问题,也就是我以前为什么讲this改成getApplicationContext()!!!

2. 话说很久以前,代码是这样的

for (int i = 0; i < items.size(); i++) {

View view = LayoutInflater.from(this).inflate(R.layout.sub_xeb_webview, null);

mListPagerViews.add(view);

}

这样写会有一个什么问题呢?在这个Activity以及前一个Activity之间不停切换,最后程序自动退出到主页面,没有ANR ,没有错误提示,基本上可以理解成页面崩溃。我就新建了一个工程,专门用来测试这段代码,开始怀疑是不停的LayoutInflater.from(this).inflate(R.layout.sub_xeb_webview,
null); 导致的,换成下面的样子

for (int i = 0; i < items.size(); i++) {

View view = new View(this);

mListPagerViews.add(view);

}

居然不崩溃了,继续定位,直到换成下面的代码

for (int i = 0; i < items.size(); i++) {

WebView view = new WebView (this);

mListPagerViews.add(view);

}

至此,可以明显的看到是Webview在捣鬼啊,百度一下,发现某些ANDROID版本的手机,要将webview destroy掉,在4.0以上的好像就不用了,最后,在layout中提取到webview 销毁,程序不在崩溃了。

3. android 自诩不用管理内存,我干她奶奶的,这套不管理内存的机制还真是坑爹,多少个坑啊,等着我们去踩,bitmap就是最大的一个坑,申请释放,还不立马释放,导致 use a recycle bitmap.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: