在单独的线程中使用位图

时间:2013-03-10 10:34:57

标签: android multithreading memory bitmap

我正在开展一个项目,打开图像,玩它,然后保存。图像可以是一个非常巨大的图像,如相机图片,所以我做了几件事来确保不会出现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 ...

有没有办法打开一个线程来执行具有更多内存的图像操作(例如,释放活动本身使用的内存,因为它是另一个线程)?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用池线程来执行多个线程,与为每个线程创建新的Thread对象相比,它不那么“昂贵”。

本指南可能有所帮助:http://developer.android.com/training/multiple-threads/create-threadpool.html

或者这个 http://android-developers.blogspot.com/2009/05/painless-threading.html