我知道这是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;
}
的链接中很多非常详细的解释向我们展示了如何创建位图的代码。你可以在较低的分辨率下解码它。如果它只是一个拇指 – Blundell
@Blundell看看编辑。 –