试图将大图像显示为没有打嗝的瓷砖

时间:2012-02-06 17:14:19

标签: android bitmap garbage

我的平板电脑应用必须显示非常大的图像(2500x6000)并允许用户平移,放大和放大出。因为它不能适应内存我已经把它分成了瓷砖,并根据需要加载它们。我遇到的问题是,每当我卸载或替换位图时,我都会导致垃圾收集,这会导致我的应用程序停顿不前。我想知道是否有人想出任何聪明的方法来解决这个问题?我使用BitmapFactory.decodeResource创建我的位图。我已经尝试替换相同的位图但垃圾收集仍然运行(假设它转储旧位图并用新位图替换它)。

谢谢!

4 个答案:

答案 0 :(得分:1)

想出答案!在API11 + BitmapFactory.Options中有一个名为inBitmap的属性,它将在加载内容时重用位图。我已经实现了它:

mBg[i] = Bitmap.createBitmap(800, 1232, Bitmap.Config.RGB_565);
mBgOptions[i] = new BitmapFactory.Options();
mBgOptions[i].inBitmap = mBg[i];
mBgOptions[i].inPreferredConfig = Bitmap.Config.RGB_565;
mBgOptions[i].inMutable = true;
mBgOptions[i].inSampleSize = 1;

垃圾收集器不再运行,暂停已被删除。 作为f.y.i,必须设置inSampleSize或它不起作用。

答案 1 :(得分:0)

如果你的目标是Android 3.0,那么这个答案可能有所帮助:

在Android 3.0之前,您可以构建平铺图像的HTML页面,让内置浏览器处理图像的加载和卸载。我的答案有更多细节:

其他人有其他方法吗?

答案 2 :(得分:0)

您使用的是android:largeHeap =“true”吗?这可能会降低GC的频率。另外,鉴于您的目标是平板电脑,那么您可以放心地假设您正在处理并发垃圾收集器。因此,如果它有更多,更小的内存块来收集,即更小的磁贴,它将最有效。

答案 3 :(得分:0)

我使用了这个易于整合的WorldMap应用程序源:

https://github.com/johnnylambada/WorldMap

它使用世界地图的巨大图像,并使用缓存来显示地图。

为了整合,我只是复制了所有的java文件(我猜是5)并在我的布局文件中使用了surfaceView。然后我经历了ImageViewerActivity.java的小OnCreate()方法,并在我的活动中使用了代码(根据我的个人用途进行了改变)。