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