我正在开展一个项目,打开图像,玩它,然后保存。图像可以是一个非常巨大的图像,如相机图片,所以我做了几件事来确保不会出现OutOfMemory异常(基本上是http://developer.android.com/training/displaying-bitmaps/load-bitmap.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个)。
使用后回收每个位图
在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();
我希望通过这个新线程获得一个完全无内存的空间来执行Image操作任务,但我发现应用程序因同样的原因在同一点崩溃。线程被创建为子进程(ok),但共享最大堆和当前使用的mem ...
有没有办法打开一个线程来执行具有更多内存的图像操作(例如,释放活动本身使用的内存,因为它是另一个线程)?
非常感谢。
答案 0 :(得分:1)
您可以使用池线程来执行多个线程,与为每个线程创建新的Thread对象相比,它不那么“昂贵”。
本指南可能有所帮助:http://developer.android.com/training/multiple-threads/create-threadpool.html
或者这个 http://android-developers.blogspot.com/2009/05/painless-threading.html