2016-12-21 1 views
0

Salut J'ai utilisé le code ci-dessous pour charger l'image sur l'élément listview du widget.Comment activer le cache pour l'image bitmap en utilisant SimpleImageLoadingListener dans 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; 

Et dans mon dossier de candidature que j'ai utilisé le code ci-dessous,

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

Mais ce code téléchargera l'image de chaque URL. Je ne veux pas le recharger à chaque fois que vous faites défiler la vue de ma liste de widgets d'applications. Il doit être conservé dans le cache après sa première utilisation. Pourriez-vous s'il vous plaît me suggérer une idée pour le faire?

+0

Ceci n'est pas une solution à votre question mais une suggestion pour laquelle vous ne pouvez pas utiliser [glide] (https://github.com/bumptech/glide). C'est mieux dans mon cas. J'espère que vous aussi? – Raghavendra

+0

@Raghavendra Salut j'utilise un widget où nous pouvons définir l'image sur la vue de l'image comme ce remoteView.setImageViewBitmap (R.id.feed_image, mBitmap); où R.id.feed_image est mon identifiant de vue d'image. J'ai de la difficulté à utiliser la bibliothèque de glissement dans le widget. Savez-vous comment utiliser le glissement dans un widget comme celui-ci? – Sangeetha

Répondre

0

À partir de votre code, vous créez DisplayImageOptions à chaque fois. Je pense que c'est la raison pour faire DisplayImageOptions pour une fois (à l'extérieur de votre Runnable objet) Utilisez comme ceci:

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

ensuite à l'intérieur runnable à votre autre code

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

} 

});

Faites-moi savoir s'il vous plaît le résultat.

+0

J'ai essayé comme vous l'avez dit. Mais c'est à nouveau télécharger. – Sangeetha

+0

Universal Image loader vérifie d'abord dans votre cache avec imgUrl que tout cache pour cette imgUrl existe ou non. Si trouvé, chargez-le à partir du cache sinon téléchargez-le du serveur et mettez-le en cache. Veuillez vérifier combien de temps il faut pour afficher l'image dans imageView après chaque chargement. Si le temps varie entre le premier chargement et le prochain chargement, l'image doit être chargée à partir du cache. – MdFazlaRabbiOpu

+0

@ MdFazlaRabbiOpu Cela prend quelques secondes. Parfois, cela prend plus d'une minute. – Sangeetha