3
4

3 回答 3

1

我认为问题出在 doInBackground 方法中的 BitmapFactory 上。这种解码会消耗大量内存并且还存在一些已知的泄漏。我总是缩放它以减少内存消耗,而不是解码整个图像。有一个例子:

  //decodes image and scales it to reduce memory consumption
  private static Bitmap decodeImage(InputStream in, InputStream in2){

          //Decode image size
          BitmapFactory.Options o = new BitmapFactory.Options();
          o.inJustDecodeBounds = true;
          BitmapFactory.decodeStream(in,null,o);

          //The new size we want to scale to
          final int REQUIRED_SIZE=100;

          //Find the correct scale value. It should be the power of 2.
          int scale=1;
          while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
              scale*=2;

          //Decode with inSampleSize
          BitmapFactory.Options o2 = new BitmapFactory.Options();
          o2.inSampleSize=scale;
          o2s.inTempStorage = new byte[16*1024];

          return BitmapFactory.decodeStream(in2, null, o2);

  }

注意:您需要打开两个输入流实例。

其他建议是每次图像不再有用时调用 Bitmap 中的 clear() 方法。

我希望这可以帮助你!

于 2012-10-01T10:24:57.187 回答
0

尝试将您的任务设置为:

        DownloadBitmapTask task = new DownloadBitmapTask(context,image, 
                holder.cellProgress); 

位图下载完成时为空。您没有关闭/处置在 AsyncTask 中分配的所有资源,并且 GC 无法释放它们。

于 2012-10-01T10:49:46.900 回答
0

我认为您应该在每次打开时关闭输入流,如下所示。

InputStream iStream = null;
try{
     URLConnection conn = (new URL(args[0])).openConnection();
     iStream = conn.getInputStream(); 
     itmap = BitmapFactory.decodeStream(iStream);

     done = true;
   }catch(IOException ex){
      failedTries++;
      try {
           Thread.sleep(100);
          } catch (InterruptedException e) {
          }
   } finally {
      if(iStream != null)
          iStream.close();
   }

注意:-建议在使用后关闭任何流。

于 2012-10-01T10:44:59.927 回答