Android webView加载数据时内存溢出问题及解决

目录
  • Android webView加载数据时内存溢出
  • Android内存问题 (内存溢出 内存泄漏 内存抖动)
  • 总结

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时间。以空间换时间的典型

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android WebView实现全屏播放视频

    目录 介绍 主要代码 介绍 最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看到后不要再犯类似的错误,尽可能提高开发效率: 这个Demo我这里也参考了网上写的一个比较好的一个Demo,经过总结修改,写出来的. 主要代码 以下是相应代码: MainActivity: package com.androidwebviewdemo; import android.app.Activity; import androi

  • Android WebView预渲染介绍

    目录 前言 术语对齐 客户端可以从哪些方面优化h5页面的加载速度? 优化思路 预渲染的基本实现逻辑是怎样的? 预创建 预创建个数 预创建时机 预创建复用 预渲染 预渲染时机 预渲染有效性校验 时间有效性 状态有效性 页面显示状态通知 其它注意事项 预渲染存在哪些局限性? 总结 前言 在一个Hybrid项目中,必不可少的就是加载h5页面.h5页面的加载性能极大影响着用户体验,并会从各方面影响到我们APP的业务数据.试想,假设一个h5页面要花好几秒才能打开,那用户还会使用我们的APP吗?所以今天我们

  • Android WebView基础应用详解

    目录 一.WebView的基础配置 二.WebView支持播放音乐 三.WebView支持视频播放 四.WebChromeClient 五.WebViewClient 1.重定向问题 2.实现预加载 3.增加错误页面展示限制 4.解决页面白屏问题 附GitHub源码:WebViewExplore 一.WebView的基础配置 WebSettings ws = getSettings(); ws.setBuiltInZoomControls(true);// 隐藏缩放按钮 ws.setLayout

  • Android WebView缓存机制优化加载慢问题

    目录 一 .前言 二 .WebView存在的性能问题 2.1 H5 页面加载速度慢 2.1.1 渲染速度慢 2.1.2 页面资源加载缓慢 2.2 耗费流量 2.3 总结 三 .解决方案 3.1 前端H5的缓存机制 3.1.1 缓存机制 3.1.2 缓存模式 3.2 资源预加载 3.2.1 预加载WebView对象 3.2.2 预加载H5资源 3.3 自身构建缓存 3.3.1 需求场景 3.3.2 实现步骤 3.3.3 具体实现 3.3.4 具体实例 一 .前言 由于H5具备 开发周期短.灵活性好

  • 浅谈Android开发Webview的Loading使用效果

    目录 前言 1. loading的选择 2. loading显示时机的问题 3. 体验优化 4. loading最终设计效果 总结 前言 在开发webview的loading效果的时候会有一些问题,这边记录一些碰到的常见的问题,并且设计出一套Loading的方案来解决相关的问题. 1. loading的选择 开发loading效果的原因在于webview加载页面的时候,有时候会耗时,导致不显示内容又没有任何提示,效果不太好,所以需要在webview使用的地方加上loading的效果,其实更好的体

  • Android WebView软键盘遮挡输入框方案详解

    目录 背景 纪实 方案 实现 总结 背景 笔者在使用 WebView 加载含有输入框的 H5 页面时,点击输入框后,输入框会被软键盘遮挡住,无法看到输入的内容,这很影响用户体验. 笔者想着这种业务场景比较常见,遂上网搜索一番,果不其然,有不少同志遇到这个问题,想来这个问题很好解决了.笔者一一尝试了同志们提供的解决方案,结果要不是没有作用,要不是效果不太满意,只好自己另辟蹊径了. 注:在笔者的业务场景中,App是全屏的,即没有顶部的系统栏,也没有底部的导航栏,所以笔者的解决方案,可能不适用于其他场

  • Android WebView如何判断是否滚动到底部

    目录 场景: 分析: 实现: 总结 场景: 我们有时候需要弹一些必读公告,但是呢可能会要去你看完之后才可以关掉,所以就需要滚动到底部才显示关闭按钮,而公告什么的往往又是基于富文本的,那么在展示在Android上时就要用到WebView,基于这个要求就有了判断 WebView 判断是否滚动到底部. 分析: 要判断是否到底部那么我们先来分析有哪几种情况,当html文档加载到WebView后会有一下两种情况. WebView里的html内容没有填充满,就是无滚动条情况.html内容的高度比WebVie

  • Android WebView控件基本使用示例

    Android WebView用于在 android 中显示网页.可以从相同的应用程序或 URL 加载网页.它用于在 android 活动中显示在线内容. Android WebView 使用 webkit 引擎来显示网页. android.webkit.WebView 是 AbsoluteLayout 类的子类. Android WebView 类的loadUrl()和loadData()方法用于加载和显示网页. Android WebView 示例 让我们看看使用 Web 视图显示 baid

  • Android WebView输入框被档问题升级解析

    目录 前言 issue 5497问题 布局顶起后距离软键盘有一定距离 Activity的webview输入框被挡 总结 前言 之前写过一篇文章,有讲如何处理Android输入框被软键盘挡住的问题,无论是原生的还是webview的,这里面主要的问题是webview的问题比较难处理,没有看过的可以先看看  Android 输入框被挡问题完美解决方案 主要是issue 5497这个问题.然后可能有些朋友觉得,这篇文章没能解决他的问题,或者说按照我的代码去写又会出现新的问题.这说明没有能理解这篇文章写的

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • Android webview加载https链接错误或无响应的解决

    最近做无线WiFi的时候,在最后认证成功的时候会弹出一个广告页,于是用webview去加载了一下,结果没反应,打印url出来看了一下,发现是https格式的,在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问题.那么,我们就要针对这一状况作出对应的处理. 于是百度了一下,这里记录一下,给大家做个参考: 1.设置WebView接受所有网站的证书 在认证证书不被Android所接受的情况下,我们可以通过设置重写WebViewClient

  • Android异步加载数据和图片的保存思路详解

    把从网络获取的图片数据保存在SD卡上, 先把权限都加上 网络权限 android.permission.INTERNET SD卡读写权限 android.permission.MOUNT_UNMOUNT_FILESYSTEMS android.permission.WRITE_EXTERNAL_STORAGE 总体布局 写界面,使用ListView,创建条目的布局文件,水平摆放的ImageView TextView 在activity中获取到ListView对象,调用setAdapter()方法

  • jQuery Ajax 加载数据时异步显示加载动画

    ajax加载后台数据就不说的那么细了. 看下面代码首先前台上放置代码 <div id="loadgif" style="width:66px;height:66px;position:absolute;top:50%;left:50%;"> <img alt="加载中..." src="../../Images/loading1.gif"/> </div> 在js脚本文件中首先把这个图片动画

  • Android webview加载H5方法详细介绍

    目录 1,安卓APP 怎么用webview加载H5 2,H5怎么调用安卓定义的方法 3,安卓怎么调用H5定义的方法 这篇文章主要阐述3个知识点 安卓APP 怎么用webview加载H5 H5怎么调用安卓定义的方法 安卓怎么调用H5定义的方法 1,安卓APP 怎么用webview加载H5 安卓端定义个webview xml 页面,代码如下所示: <?xml version="1.0" encoding="utf-8"?> <WebView xmlns

  • layui: layer.open加载窗体时出现遮罩层的解决方法

    如下所示: 把窗体方法独立出来放在layer.use([],function(){});外面,需要的时候从layer.use方法里面调用,就不会出现遮罩层 layer.use([],function(){ $("#添加按钮id").click(function(){ editData("",form,"添加") ; }) ; }); function editData(data,from,title){ var win = layer.open(

  • Android中加载网络资源时的优化可使用(线程+缓存)解决

    网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: 复制代码 代码如下: <SPAN style="FONT-SIZE: 18px"><STRONG>publ

  • android WebView加载html5介绍

    Android设备多分辨率的问题 Android浏览器默认预览模式浏览 会缩小页面 WebView中则会以原始大小显示 Android浏览器和WebView默认为mdpi.hdpi相当于mdpi的1.5倍 ldpi相当于0.75倍 三种解决方式:1 viewport属性 2 CSS控制 3 JS控制 1 viewport属性放在HTML的<meta>中 Html代码 复制代码 代码如下: <SPANstyle="FONT-SIZE: x-small"> <

  • 详解Android WebView加载html片段

    这里我先简单描述一下需求:服务器返回的是html页面的一部分带有标签的内容. 解决的思路是:将服务器返回的内容片段拼凑成一个完整的页面. 下面直接上核心代码: 这里是WebView一些配置 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); settings.setUseWideViewPort(true);

  • phpExcel导出大量数据出现内存溢出错误的解决方法

    phpExcel将读取的单元格信息保存在内存中,我们可以通过 复制代码 代码如下: PHPExcel_Settings::setCacheStorageMethod() 来设置不同的缓存方式,已达到降低内存消耗的目的! 1.将单元格数据序列化后保存在内存中 复制代码 代码如下: PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized; 2.将单元格序列化后再进行Gzip压缩,然后保存在内存中 复制代码 代码如下: PHPEx

随机推荐