1,解决使用Bitmap时出现的内存溢出

1)及时的销毁,虽然,系统能够确认Bitmap分配的内存最终会被销毁,但是由于它占用的内存过多,所以很可能会超过java堆的限制。因此,在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即就会将Bitmap释放掉,但是会给虚拟机一个暗示:“该图片可以释放了”。

2)设置一定的采样率,有时候,我们要显示的区域很小,没有必要将整个图片都加载出来,而只需要记载一个缩小过的图片,这时候可以设置一定的采样率,那么就可以大大减小占用的内存。如下面的代码:

private ImageView preview;

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 2;

Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),

null, options);

preview.setImageBitmap(bitmap);

3)运用软引用(SoftRefrence),有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。如下例:

private class MyAdapter extends BaseAdapter {

private ArrayList mBitmapRefs = new ArrayList();

private ArrayList mValues;

private Context mContext;

private LayoutInflater mInflater;

MyAdapter(Context context, ArrayList values) {

mContext = context;

mValues = values;

mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

public int getCount() {

return mValues.size();

}

public Object getItem(int i) {

return mValues.get(i);

}

public long getItemId(int i) {

return i;

}

public View getView(int i, View view, ViewGroup viewGroup) {

View newView = null;

if(view != null) {

newView = view;

} else {

newView =(View)mInflater.inflate(R.layout.image_view, false);

}

Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName);

mBitmapRefs.add(new SoftReference(bitmap)); //此处加入ArrayList

((ImageView)newView).setImageBitmap(bitmap);

return newView;

}

}

2,解决Context引起的内存溢出:

在Android平台上,长期保持一些资源的引用,造成一些内存不能释放,带来的内存泄露问题很多。比如Context。

android中的很多资源文件都需要一个Context引用来加载,如果这些资源没有被释放,那么Context的引用不为null,造成对应的Activity即使 调用了finish()但其占有的内存依然不能被释放。这是 因为在Java或者Android内存机制中,顶点的结点释放前必须保证其他对象没有调用才能被系统GC回收释放。我们来看一段代码:

SoundManager.getInstance(this).play(SoundManger.MAIN_BG_SOUND);

从这段代码可以看出,声音管理类是一个单例,它对于整个应用进程来说是全局的,在进入应用的时候创建这个单利直到应用结束,这个单例才会被释放。大家可以看到这个类在得到单例的时候需要传递一个Context对象作为参数,因为要利用Context来加载声音资源。这就导致如果当前Activity调用了finish()全依然不能被GC,因为声音管理类是全局的,它持有了当前Activity的应用,阻止了其被GC。 解决的办法是尽量使用全局的Context来加载资源。修改如下:

SoundManager.getInstance(this.getApplicationContext).play(SoundManger.MAIN_BG_SOUND);

3,解决Thread 线程引起的内存溢出

如下代码:

private class MyThread extends Thread{

@Override

public void run() {

super.run();

while(bFlag)

{

//do somthing

}

}

MyThread mThread = new MyThread();

mThread.start();

这端代码 在主线程里新开了一个线程,并且在线程里循环处理一些逻辑。问题在于 如果控制线程结束的bFlag如果在Activity销毁时没有置为 false 将会产生很严重的后果。线程的一个特点是生命周期的不可控。如果Activity销毁时,没有结束线程的运行,那么不仅阻止了Activity被GC,而且大大降低了程序的性能。假如,再重新进入这个Activity,那么又创建了一个死循环的线程,而之前的那个线程依然在运行,这样程序就会非常的卡。所以 一定要注意,销毁Activity时一定要结束线程。

总而言之,想要避免context 相关的内存泄漏 ,记住以下几点:

a.不要对activity 的context 长期引用( 一个activity 的引用的生存周期应该和activity 的生命周期相同)

b.试着使用关于application的 context 来替代和activity相关的context

c.如果一个acitivity 的非静态内部类的生命周期不受控制,那么避免使用它;使用一个静态的内部类并且对其中的activity 使用一个弱引用。解决这个问题的方法是使用一个静态的内部类,并且对它的外部类有一WeakReference,就像在ViewRoot中内部类W所做的就是这么个例子。

android 内存溢出解决方法,android内存溢出解决相关推荐

  1. android颜色值的表示方法android:background=#FFFFFFFF的意思

    android颜色值的表示方法 android:background="#FFFFFFFF"的意思 Android中的颜色值是通过红(Red).绿(Green).蓝(Blue)三原 ...

  2. 远程连接桌面黑屏解决方法(Winlogon错误的解决办法)

    远程连接桌面黑屏解决方法(Winlogon错误的解决办法) 参考文章: (1)远程连接桌面黑屏解决方法(Winlogon错误的解决办法) (2)https://www.cnblogs.com/Koke ...

  3. Win7中右下角“小喇叭”声音图标消失的解决方法?(已解决)

    Win7中右下角"小喇叭"声音图标消失的解决方法?(已解决) 1.打开任务管理器. 2.右键explorer.exe选择右键结束. 3.在按ctrl+shift+Esc,或者用al ...

  4. java heap space 解决方法_内存溢出错误:java堆空间

    本文为翻译的文章,作者PANKAJ,原文: https://www.journaldev.com/21010/java-lang-outofmemoryerror-java-heap-space 当J ...

  5. AndroidStudio初学者常见错误及解决方法:内存不足

    当我们在学习一门新的软件的时候,俗话说"万事开头难",我们要是在第一次运行这个软件程序的时候就报错,并且一直找不到解决的方法,那是相当的气馁甚至会有想要放弃的念头. 现在让我来帮你 ...

  6. android 混淆不混淆第三方jar,Android 第三方Jar包FastJson 代码混淆时的解决方法 - Android开发论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    我们做AndroidApp软件的时候,经常会对App进行签名打包和代码混淆,在工程中没有使用第三方Jar文件的时候不用考虑很多因素,现在要说的是当你在你的工程使用使用了FastJson这个快速解析Js ...

  7. android系统锁屏锁怎么解决方法,Android 屏幕锁 - WakeLock

    Android 屏幕锁 - WakeLock Android,powermanager,wakelock,屏幕, PowerManager android.os.PowerManager PowerM ...

  8. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  9. android monitor的使用方法,Android Device Monitor使用方法及常见问题解决方案

    Android Device Monitor使用方法及常见问题解决方案 发布时间:2018-07-17 18:18, 浏览次数:1184 , 标签: Android Device Monitor DD ...

最新文章

  1. 【POJ1456】Supermarket
  2. PHP+mysql+ajax搭建图书管理系统
  3. 1.1 VMware 一步一步创建虚拟机
  4. 【Python】利用 Python 实现多任务进程
  5. Visual Studio下载、安装、运行教程
  6. php协程实现mysql异步_swoole与php协程实现异步非阻塞IO开发
  7. C# PagedList 真分页
  8. 面对SDN/NFV部署挑战 网络厂商能做什么?
  9. 低欲望社会有多可怕?仅94万!日本去年新生人口数创历史新低,空房子如瘟疫般蔓延...
  10. git完全cli指南之详细思维导图整理分享
  11. 霍尔传感器和直流无刷电机
  12. 利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm
  13. PreScan中Sensor的理解
  14. 关于RGB888和RGB565互转代码实现方案推荐
  15. break 和continue 区别以及用法。
  16. 【c++】CTGU2022春校赛原题详解--可以冰墩墩一墩难求啊--单调栈
  17. bilibili直播 斗鱼直播等直播工具黑屏怎么办?
  18. uniapp打包的app上架应用商店隐私政策:您的应用在用户同意隐私政策前申请获取用户个人信息
  19. 清理Win10系统C盘的脚本方法
  20. php是什么症状脾虚什么症状怎么治,脾虚的症状及治疗方法是什么

热门文章

  1. 数据库复习(数据管理系统)
  2. 看了最高估值的“五虎上将”,你会不会觉得科创板已经疯了?
  3. 解决:QSqlQuery出现parameter count mismatch
  4. 假设某系统的登录账号是“Admin“,密码是“p888888“;编程实现要求用户输入账号和密码,当验证通过时显示“登录成功”,当验证失败时显示“账号或密码错误”
  5. Alfred之workflow入门
  6. 银行家算法课程设计java语言_Java语言的银行家算法
  7. debug : 下载动态url失败的原因之一
  8. 趣谈达磨传授衣钵时发生的故事
  9. 关于springboot /tmp目录
  10. Python遥感图像处理应用篇(二十五):Python+GDAL 波段组合