内存问题
所以我正在编写一个应该能够翻阅详细视图的应用程序,该视图在顶部有一个大的640 x 480图像,而3个图像是延迟加载的图库的一部分。遵循Google设计指南,这就是他们的建议。由于内存不足,我可以在崩溃之前浏览12到13个碎片。我认为这个问题有几个罪魁祸首。
1。)我正在使用FragmentStatePager。当内存成为问题时,这不应该破坏未被查看的片段吗?这不会发生。我以为这是自动的。我该怎么做才能实现这一目标?它可能与我如何实现Fragment有关吗?我在onCreateView中完成了所有的Activity配置。为了彻底,我已经包含了这个来源。普通香草在这里:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return InventoryDetailFragment.newInstance(position);
}
}
2。)我有一种方法试图找出需要下载的图像大小而不将其放在内存中。然后压缩图像,同时将其下载到所需的大小。这没有成功实施。但我不确定会出现什么问题。
private Bitmap downloadBitmap(String url, int width, int height) {
Bitmap bitmap = null;
int scale = 1;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, options);
if (options.outHeight > height || options.outWidth > width) {
scale = (int) Math.max(((options.outHeight)/ height), ((options.outWidth)/ width)); }
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, o2);
cache.put(url, new SoftReference<Bitmap>(bitmap));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Error e){
Log.d("TEST", "Garbage Collector called!");
System.gc();
}
return bitmap;
}
我已经尝试了所有我知道如何做的事情,但这超出了我对Android / Java的微薄掌握。请帮忙!谢谢!
答案 0 :(得分:1)
您需要更改一些内容:
这是一个可怕的想法:BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, options);
每次执行此操作时,您都会从网络上获取图像(所以在您发布的代码中两次)。相反,您需要下载图像并在本地缓存它。
在片段分离后立即向片段添加逻辑以在位图上调用recycle()
。添加逻辑以便在连接片段时始终重新加载图像(从缓存中)。
inSampleSize
计算错误。 inSampleSize
应该是2的幂,例如1,2,4,8。您可以使用对数或简单的二进制逻辑来获得正确的,这是我使用的,它将始终使用至少2进行缩减采样(只有在您知道图像太大时才调用它):-
int ratio = (int) Math.max((height/options.outHeight), ( width/options.outWidth); //notice that they're flipped
for (int powerOfTwo = 64; powerOfTwo >=2; powerOfTwo = powerOfTwo >> 1 ) { //find the biggest power of two that represents the ratio
if ((ratio & powerOfTwo) > 0) {
return powerOfTwo;
}
}
答案 1 :(得分:0)
如果你用opengl意识到你的图形,这将不计入内存。 另一个选择是使用
android:largeHeap="true"
清单中的。可以工作。
您是否使用ddvm搜索内存泄漏?