我正在一个项目中工作,该项目可以打开图像,使用它并保存。该图像可以是一个非常大的图像,例如相机图片,因此我正在做几件事以确保不会出现 OutOfMemory 异常(基本上出现在这里http://developer.android.com/training/displaying-bitmaps/load-位图.html):
- 在不实际打开图像的情况下执行图像的所有宽度和高度测量,使用:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image_path, options);
打开的图像已经调整大小(inSampleSize)并使用
Bitmap.Config.RGB_565
(每像素 2B)除了Bitmap.Config.ARGB_8888
(每像素 4B)。使用临时文件在内存中没有很多位图(实际上我只有一个大多数情况,应用掩码时最多 2 个)。
使用后回收每个位图
当在 a 中显示结果时
ImageView
,打开它已经缩放到屏幕尺寸。
但是,在某些情况下,当一次只加载一个位图来完成某项工作(旋转图像、微调调整大小、应用蒙版等)是不可能的,并且主要是在中等范围或旧设备中,我获得OutOfMemory 异常。
我已经开始添加所有在后台作业中工作的图像,如下所示(好的,我是新手):
ProgressDialog dialog = ProgressDialog.show(this, null, "Please wait", true, false);
new Thread(new BackgroundJob(this, new Runnable() {
public void run() {
ImageHelper.ImageManipulation(image_path);
}
}, dialog, new Handler())).start();
我希望通过这个新线程获得一个完全可用的内存空间来执行图像处理任务,但我发现应用程序出于相同的原因在相同的点崩溃。线程被创建为子进程(好的),但共享最大堆和当前使用的内存......
有没有办法打开一个线程来执行具有更多内存的图像操作(例如,释放活动本身使用的内存,因为它是另一个线程)?
非常感谢你。