2016-12-21 1 views
0

Привет Я использовал ниже код для загрузки изображения в элементе списка виджетов.Как включить кеш для растрового изображения с помощью SimpleImageLoadingListener в Universal Image Loader android

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; 

И в мой файл приложения я использовал код ниже,

// 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 

Но этот код будет загружать изображения из URL-адреса каждый раз. Я не хочу перезагружать его каждый раз при прокрутке списка виджетов виджета приложения. Он должен храниться в кеше после загрузки в первый раз. Не могли бы вы предложить мне какую-нибудь идею сделать это?

+0

Это не решение вашего вопроса, но предложение, почему вы не можете использовать [glide] (https://github.com/bumptech/glide). Это лучше в моем случае. Надеюсь, у вас тоже? – Raghavendra

+0

@Raghavendra Привет, я использую виджет, где мы можем установить изображение на изображении таким образом, как этот remoteView.setImageViewBitmap (R.id.feed_image, mBitmap); где R.id.feed_image - мой идентификатор изображения. У меня возникают проблемы с использованием библиотеки glide в виджетах. Вы знаете, как использовать глид в виджетах, подобных этому? – Sangeetha

ответ

0

С вашего кода вы создаете DisplayImageOptions каждый раз. Я думаю, что это причина сделать DisplayImageOptions за один раз (за пределами вашей Runnable Objet) Используйте так:

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

Тогда внутри работоспособной на свой другой код

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

} 

});

Пожалуйста, дайте мне знать результат.

+0

Я пробовал, как вы сказали. Но его снова загружают. – Sangeetha

+0

Универсальный загрузчик изображений сначала проверяет в вашем кеше с imgUrl, что любой кеш для этого imgUrl существует или нет. Если он найден, загрузите его из кеша, иначе загрузите его с сервера и сохраните в кеше. Проверьте, сколько времени требуется, чтобы показать изображение в imageView после каждой загрузки. Если время изменяется от первой нагрузки до следующей загрузки, то изображение должно загружаться из кеша. – MdFazlaRabbiOpu

+0

@ MdFazlaRabbiOpu Это занимает несколько секунд. Несколько раз это занимает больше одного раза. – Sangeetha

Смежные вопросы