2012-06-14 39 views
0

我知道这是SO中最常见的问题之一,但没有其他答案给了我一个解决方案。但从阅读其他答案看,我需要重新设计应用程序的工作方式。Android - ScrollView中的内存不足异常

就是这样,我们有一个ScrollView,它会膨胀一些视图。在这种情况下不能使用ListView,因为按照我们希望的方式行事将需要扩展ListView,这是我们不想做的事情(尽管这似乎是我们目前唯一的解决方案显示项目,因为这个OOM例外)。该列表每行可以有很多列,屏幕越大,列数越多。

每个充气视图都有一个布局,显示数​​据库中的一些信息,包括图片。该图片通过字节数组存储。这是使用设备相机拍摄的任何照片。目前每张照片(字节数组)都在800kb到1mb之间,这对我来说很重要。现在这个清单有30多个项目。我拍了照片,直到OOM发生,而且我总共拍了6张照片(偶尔有7张)。这将是8mb-9mb的数据。每次我去其他活动,并返回到ScrollView所在的活动,该列表需要重新填充。

这是PopulateList方法的片段:

if (item.getImg() != null) { 

      if (App.debug) { 

       Log.d(TAG, "Setting bmp."); 
      } 

      Bitmap bmp = App.byteArrayToBmp(item.getImg()); 

      imgV.setImageBitmap(bmp); 
     } 

每个充气View将打开“高级对话”,其中将包含其他信息。也许图像可能会出现在列表中(这意味着只有一个位图,因为每个虚拟View都共享相同的高级对话框)。或者我可以扩展ListView并从它的回收方法中受益(这不是一个好的解决方案,但我认为可以在屏幕上看到6个以上的项目)。困扰我的另一件事是每张图片都有800kb。对于128x128似乎很多。

这是大小的设置:

cameraParams.setPictureSize(App.pxToDpi(128), App.pxToDpi(128)); 
cameraParams.setPictureFormat(PixelFormat.JPEG); 

camera.setParameters(cameraParams); 

public static int pxToDpi(int px) { 

    final int scale = app.getApplicationContext().getResources().getDisplayMetrics().densityDpi; 

    int pixels = (int) px * (scale/160); 

    return pixels; 
} 

那么,你认为这是我的问题,保持我的应用程序的当前模式的解决方案,或将我需要重新制定?

编辑:位图方法:

public static Bitmap byteArrayToBmp(byte[] byteArray) { 

    Bitmap img = null; 

    BitmapFactory.Options opts = new BitmapFactory.Options(); 

    opts.inSampleSize = 2; 

    img = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length, opts); 

    return img; 
} 
+0

的链接中很多非常详细的解释向我们展示了如何创建位图的代码。你可以在较低的分辨率下解码它。如果它只是一个拇指 – Blundell

+0

@Blundell看看编辑。 –

回答

2

你可能想看看官方Android Training docs,他们刚刚进行了更新:

退房Displaying Bitmaps Efficiently与教训:Loading Large Bitmaps Efficiently是越过这。

基本上可以解码图像它using sampleSize to decode到你想要的宽度和高度:

public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     if (width > height) { 
      inSampleSize = Math.round((float)height/(float)reqHeight); 
     } else { 
      inSampleSize = Math.round((float)width/(float)reqWidth); 
     } 
    } 
    return inSampleSize; 
} 

以上

+0

非常有趣。我会读这个,看看我能否解决这个问题。但我真的不知道这是否会产生任何效果,因为我已经将图片设置为128x128的行:'cameraParams.setPictureSize(App.pxToDpi(128),App.pxToDpi(128));' 将给它是一个镜头,虽然。 –