How to enable cache for bitmap using SimpleImageLoadingListener in Universal Image Loader android

147 Views Asked by At

Hi I have used below code to load image on widget listview item.

Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
    Bitmap mBitmap;
    Handler handler = new Handler(Looper.getMainLooper());


 flags.put(position, false);
            handler.post(new Runnable() {
                @Override
                public void run() {
                    ImageLoader imageLoader = ImageLoader.getInstance();
                    DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                            .cacheOnDisc(true).resetViewBeforeLoading(true)
                            .build();
                    imageLoader.loadImage(item.mTooteet.getThumbUrl1() + "&userToken=" + userPreference.getUserToken(), options,
                            new SimpleImageLoadingListener() {
                                @Override
                                public void onLoadingStarted(String imageUri, View view) {
                                    Log.d(TAG,"onLoadingStarted  "+position);
                                }

                                @Override
                                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                                    Log.d(TAG,"onLoadingFailed  "+position);
                                    flags.put(position, true);
                                }

                                @Override
                                public void onLoadingCancelled(String imageUri, View view) {
                                    Log.d(TAG,"onLoadingCancelled  "+position);
                                    flags.put(position, true);
                                }

                                @Override
                                public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
                                    Log.d(TAG,"onLoadingComplete  "+position);
                                    mBitmap = bitmap;
                                    flags.put(position, true);
                                }
                            });
                }
            });

            while (!flags.get(position)) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            flags.put(position, false);
            if (mBitmap != null) {
                Log.d(TAG,"onLoadingComplete mBitmap not null "+position);
                remoteView.setImageViewBitmap(R.id.feed_image, mBitmap);
            } else {
                Log.d(TAG,"onLoadingComplete mBitmap null "+position);
                remoteView.setImageViewResource(R.id.feed_image, R.drawable.app_icon);
            }
            mBitmap = null;

And in my application file i have used the below code,

 // UNIVERSAL IMAGE LOADER SETUP
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheOnDisc(true).cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .displayer(new FadeInBitmapDisplayer(300)).build();

        ImageLoaderConfiguration uilConfig = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                .discCacheSize(100 * 1024 * 1024).build();

        ImageLoader.getInstance().init(uilConfig);
        // END - UNIVERSAL IMAGE LOADER SETUP

But this code will download image from url everytime. I do not want to reload it every time when scrolling my app widget list view. It should be maintained in cache after downloaded first time. Could you please suggest me any idea to do this?

1

There are 1 best solutions below

5
On

From your code you are creating DisplayImageOptions everytime. I think this is the reason make DisplayImageOptions for one time(Outside your Runnable objet) Use like this:

ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                        .cacheOnDisc(true).resetViewBeforeLoading(true)
                        .build()

Then inside runnable to your other code

   handler.post(new Runnable() {
            @Override
            public void run() {
                 imageLoader.loadImage(..........)///same code you written

}

});

Please let me know the result.