android线程队列(一)线程阻塞

本文探讨了Android应用程序因子线程中耗时操作导致的内存泄漏和崩溃问题,特别是下载大图片时。日志显示内存超出4M限制。通过分析,指出单线程下载图片效率低下,可能导致OOM错误。作者建议使用thread+handler的消息队列来改善,但此方法仍存在内存管理问题,后续博客将介绍如何利用Looper消息队列来解决内存占用问题。
摘要由CSDN通过智能技术生成

我们的程序因为在子线程里面做耗时操作,内存泄漏导致了程序的崩溃,下面是崩溃的日志,从日志中,可以清晰的看出,超过程序的最大内存4M,导致程序内存泄漏崩溃

下载小图片(6张1M以下)的效果图(2M的图程序会崩溃):

运行出来大致是这种效果

FATAL EXCEPTION: Thread-2
Process: com.example.administrator.testz, PID: 8942
java.lang.OutOfMemoryError: Failed to allocate a 26401228 byte allocation with 4194304 
free bytes and 4MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:561)
at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:591)
at com.handler.datatimepickerdemo.HandlerPostActivity2$MyThread.run(HandlerPostActivity2.java:87)
at java.lang.Thread.run(Thread.java:761)

造成这样结果的原因是什么呢

下面是我的程序代码,大家请看,我特地去找的大图片,中国地图和世界地图,我们这个demo图片才2M不到,就导致了程序的崩溃,大家如果是学生的话,自然可以忽略不计,但是如果是做商业项目,经常需要网络下载显示高清大图,如何保证程序不崩溃呢。当然,市场上的okhttp,volley等开源框架可以实现效果,我们尝试自己用原生的请求,去下载高清大图,我们使用thread+run开辟子线程的方式,很明显无法实现我们的效果

当然,如果要解决这个问题的话很简单,因为我们的问题出现的原因是程序分配的内存太小,我们去清单文件多分点内存就可以了

//    android:largeHeap="true"  在清单文件的application中添加这个,会增大应用程序分配的内存,不容易崩溃
   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"		//添加这一句,可以多申请内存
        android:supportsRtl="true"

而且这种单线程的下载图片的方式有一个弊端,必须一个一个加载图片,上一张显示完毕,加载下一张,影响效率,图片大的话,会更加明显

下一篇博客讲解,消息队列请求下载图片


                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值