我们的程序因为在子线程里面做耗时操作,内存泄漏导致了程序的崩溃,下面是崩溃的日志,从日志中,可以清晰的看出,超过程序的最大内存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"
而且这种单线程的下载图片的方式有一个弊端,必须一个一个加载图片,上一张显示完毕,加载下一张,影响效率,图片大的话,会更加明显
下一篇博客讲解,消息队列请求下载图片