Android webView加载数据时内存溢出问题及解决
作者:代号卧底 发布时间:2021-06-24 13:19:28
Android webView加载数据时内存溢出
今天使用webView加载数据时 如果数据太长就会崩溃,造成内存溢出,在网上查找了一下资料之后 终于把它解决了,谨在此记录
1.不要在XML里面写webView 可以使用一个占位布局
<FrameLayout
android:id="@+id/layoutWebView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
2.在代码中动态创建一个webView 把这个webView放到FrageLayout这个布局中
webView = new WebViewMod(getApplicationContext());
WebSettings settings = webView.getSettings();
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
layoutWebView.addView(webView);
3.到这里基本就OK了,你可以直接在这个WebView里面加载数据了
WebViewMod 这个是我自定义的一个webView 用系统的WebView效果是一样的
4.在当前Activity销毁的时候 记得在onDestroy方法中销毁这个WebView
@Override
protected void onDestroy() {
webView.removeAllViews();
webView.destroy();
super.onDestroy();
}
大功告成!
Android内存问题 (内存溢出 内存泄漏 内存抖动)
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory
Android系统为每个应用程序申请到的内存有限,一般为64M或者128M等,我们可以在清单文件中进行配置,android:largeheap = "true" 从而给APP申请更大的内存空间;
内存泄漏: 指程序在申请内存后,被某个对象一直持有,无法释放已申请的内存空间
一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
区别:单例模式在Android开发中会经常用到,但是如果使用不当就会导致内存泄露。因为单例的静态特性使得它的生命周期同应用的生命周期一样长,如果一个对象已经没有用处了,但是单例还持有它的引用,那么在整个应用程序的生命周期它都不能正常被回收,从而导致内存泄露
如何避免呢?全局的上下文Application Context就是应用程序的上下文,和单例的生命周期一样长,这样就避免了内存泄漏。单例模式对应应用程序的生命周期,所以我们在构造单例的时候尽量避免使用Activity的上下文,而是使用Application的上下文
静态变量导致内存泄露?静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。
一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。
如何解决呢?Info作为Activity的静态成员,并且持有Activity的引用,但是sInfo作为静态变量,生命周期肯定比Activity长。
所以当Activity退出后,sInfo仍然引用了Activity,Activity不能被回收,这就导致了内存泄露。
非静态内部类导致内存泄露?非静态内部类(包括匿名内部类)默认就会持有外部类的引用,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄露。
常见 (Handler,Thread,AsyncTask)
未取消注册或回调导致内存泄露?比如我们在Activity中注册广播,如果在Activity销毁后不取消注册,那么这个刚播会一直存在系统中,同上面所说的非静态内部类一样持有Activity引用,导致内存泄露。因此注册广播后在Activity销毁后一定要取消注册
集合中的对象未清理造成内存泄露?在循环中把引用o释放了,但是它被添加到了objectList中,所以objectList也持有对象的引用,此时该对象是无法被GC的。因此对象如果添加到集合中,还必须从中删除,最简单的方法防止集合类泄漏内存的方法
解决办法:置空集合对象即可
资源未关闭或释放导致内存泄露?在使用流或者等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露
解决办法Webview下面的持有Activity引用,造成Webview内存无法释放,即使是调用了Webview.destory()}等方法都无法解决问题(Android5.1之后)。
最终的解决方案是:在销毁WebView之前需要先将WebView从父容器中移除,然后在销毁WebView。
内存抖动:是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是很频繁
内存抖动结果:如果抖动很频繁,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存,而且还是频繁抖动,就可能会需要回收内存以用于产生对象,垃圾回收机制就自然会频繁运行了)。综上就是频繁内存抖动会导致垃圾回收频繁运行。
尽量避免在循环体内创建对象,应该把对象创建移到循环体外。
注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用。
对于能够复用的对象,同理可以使用对象池将它们缓存起来。
小结:JVM以Class为执行单元,Android虚拟机以Dex执行单元,编译流程JVM直接通过Javac即可加载。
Android 虚拟机需要先编译成dex,然后编译成apk。最后执行
Android Art虚拟机在安装的时候讲dex缓存本地机器码,安装比较慢,耗存储空间
Android Dalvik虚拟机在程序运行过程中进行翻译。节省空间,耗cpu时间。以空间换时间的典型
来源:https://blog.csdn.net/u013040434/article/details/72965375


猜你喜欢
- 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 本文实例讲述了Android实现拍照上传功能的方法。分享给大家供大家参考,具体如下:1、LoginWindow.java --登录窗口pac
- 近日有朋友问我有没有如下图效果的开源控件相信大家无论是用IOS还是Android,都对这种效果不陌生,很多主流APP都会有这样或类似的效果,
- 在我们移动应用开发过程中,偶尔有可能会接到这种需求:1、在手机桌面创建一个窗口,类似于360的悬浮窗口,点击这个窗口可以响应(至于窗口拖动我
- 如果有哪一个做程序员的小伙伴说自己没有遇到中文乱码问题,我是不愿意相信的。今天在做微信订阅号的智能回复时,又一时迷乱的跳进了中文乱码这个火坑
- 使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。步骤:1).
- 前言最近业务开发部门因为开发环境和测试环境共用一个maven私仓,导致他们开发环境的API包和测试环境的API包发生了覆盖现象。于是他们向我
- 本文实例为大家分享了java导出csv格式文件的具体代码,供大家参考,具体内容如下导出csv格式文件的本质是导出以逗号为分隔的文本数据imp
- 前言注解是Java很强大的部分,但大多数时候我们倾向于使用而不是去创建注解。例如,在Java源代码里不难找到Java编译器处理的@Overr
- 上一篇我们学习了自定义ViewGroup的基本步骤,并做了一个CustomGridLayout的实例,这篇我们继续来说说自定义ViewGro
- java字符串如何进行比较?我们可以根据内容和引用来比较Java中的String。它用于身份验证(通过 equals() 方法)、排序(通过
- 本文实例讲述了C#抓取当前屏幕并保存为图片的方法。分享给大家供大家参考。具体分析如下:这是一个C#实现的屏幕抓取程序,可以抓取整个屏幕保存为
- 线索二叉树的意义对于一个有n个节点的二叉树,每个节点有指向左右孩子的指针域。其中会出现n+ 1个空指针域,这些空间不储存任何事物,浪费着内存
- 这篇文章主要介绍了SpringBoot 使用Mybatis分页插件实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- Intent在不同的组件中传递对象数据的应用非常普遍,大家都知道在intent传递对象的方法有两种:1、实现Serializable接口、2
- 关于base64编码Encode和Decode编码的几种方式Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个B
- Guava Cache:⾕歌开源缓存框架Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效
- Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安
- 目前市面上的第三方短信服务平台数量十分庞大,并能为企业提供三网合一的短信接口,这些服务商通过整合短信发送服务,简单的打包成为API和SDK接