Far*_*san 11 android out-of-memory android-viewpager universal-image-loader
我不确定带有通用图像加载器的ViewPager是否可以/应该用作类似接口的图库,因为我在从SD卡加载图像并以全屏模式查看时遇到内存不足错误.无论数字是多少,它都适用于GridView,但在查看寻呼机中查看图像时,每个位图都会占用大量内存,而在10个左右的图像之后,它会给出内存不足的错误.
我已经看到这里发布的几乎所有与使用Universal Image Loader时内存不足错误相关的问题,并且在每一个问题中都出现了配置错误.
我不知道我是否使用了错误的配置或什么,但我浪费了很多时间,并且有点卡住,任何帮助/建议将不胜感激.
ImageLoader的配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.imageDownloader(new ExtendedImageDownloader(getApplicationContext()))
.tasksProcessingOrder(QueueProcessingType.LIFO)
// .enableLogging() // Not necessary in common
.build();
Run Code Online (Sandbox Code Playgroud)
显示图像选项包括:
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.resetViewBeforeLoading()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
Run Code Online (Sandbox Code Playgroud)
我正在使用随库提供的示例项目,但这些设置也不会工作,它只是在一段时间后崩溃.我的猜测是有一个特定的回调,我必须从视图中回收位图,这是不可见的.
编辑:我知道它是一个内存泄漏,不可见的视图会在它们应该被销毁时被销毁,但内存不会被释放.下面是destroyItem回调的实现,遵循不同问题中给出的提示,但仍然无法找到内存泄漏.
@Override
public void destroyItem(View container, int position, Object object) {
// ((ViewPager) container).removeView((View) object);
Log.d("DESTROY", "destroying view at position " + position);
View view = (View)object;
((ViewPager) container).removeView(view);
view = null;
}
Run Code Online (Sandbox Code Playgroud)
它可能不是解决它的最佳实现,但它对我有用.删除ImageViews是不够的,所以我决定在'destroyItem'中回收位图:
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
ImageView imageView = (ImageView) view.findViewById(R.id.image);
if (imageView != null) {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
bitmap.recycle();
bitmap = null;
}
((ViewPager) container).removeView(view);
view = null;
}
Run Code Online (Sandbox Code Playgroud)
当您离开活动时,这不会清除最后3个活动页面,但我希望GC能够处理它们.
尝试应用以下建议:
ImageScaleType.EXACTLY
.discCacheExtraOptions(maxImageWidthForDiscCache, maxImageHeightForDiscCache, CompressFormat.PNG, 0);
归档时间: |
|
查看次数: |
11355 次 |
最近记录: |