使用通用图像加载程序查看寻呼机内存不足错误

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)

txu*_*lee 5

它可能不是解决它的最佳实现,但它对我有用.删除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能够处理它们.


nos*_*a13 4

尝试应用以下建议:

  1. 使用ImageScaleType.EXACTLY
  2. 启用光盘缓存(在显示选项中)。
  3. 最后尝试使用.discCacheExtraOptions(maxImageWidthForDiscCache, maxImageHeightForDiscCache, CompressFormat.PNG, 0);