2016-03-27 4 views
1

Я работаю над Android-приложением, которое имеет функции для загрузки изображений профиля. Проблема, с которой я столкнулся, - это когда пользователь пытается загрузить новый образ профиля, он успешно загружается на lserver, но попытка загрузить новое изображение через библиотеку волейбола не отражает нового изображения, ImageView по-прежнему показывает старое изображение. Я также вложил реализацию класса singleton class для большей ясности.Android volley image url cache не очищается

Я попытался очистить кеш, используя оба метода, упомянутые ниже, но он не работает. Также попытался сделать недействительным метод ImageView методом invalidate(), но это не работает, так что это больше похоже на проблему кэширования в Android.

Если кто-нибудь столкнулся с подобным сценарием, пожалуйста, помогите.

1) mVolleySingleton.getRequestQueue(). GetCache(). Invalidate (urlProfileImage, true);
2) mVolleySingleton.getRequestQueue(). GetCache(). Remove (urlProfileImage);

Volley Singleton реализация класса:

public class VolleySingleton { 
    private static VolleySingleton sInstance = null; 
    private ImageLoader mImageLoader; 
    private RequestQueue mRequestQueue; 

    private VolleySingleton() { 
     mRequestQueue = Volley.newRequestQueue(MainActivity.getAppContext()); 
     mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { 
      public LruCache<String, Bitmap> cache = new LruCache<>((int) (Runtime.getRuntime().maxMemory()/1024)/8); 

      @Override 
      public Bitmap getBitmap(String url) { 
       return cache.get(url); 
      } 

      @Override 
      public void putBitmap(String url, Bitmap bitmap) { 
       cache.put(url, bitmap); 
      } 
     }); 
    } 

    public static VolleySingleton getInstance() { 
     if (sInstance == null) { 
      sInstance = new VolleySingleton(); 
     } 
     return sInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     return mRequestQueue; 
    } 

    public ImageLoader getImageLoader() { 
     return mImageLoader; 
    } 
} 
+0

'// Если вы не хотите использовать кеш mImageLoader = новый ImageLoader (mRequestQueue, новый ImageLoader.ImageCache() { @Override public Bitmap getBitmap (String url) { return null; } @Override общественного недействительными putBitmap (String URL, Bitmap Bitmap) {} }); ' – BNK

+0

Даже если я отключить кэширование, как вы предложили, до сих пор я не могу видеть обновленное изображение. –

ответ

0

первых, как вы VolleySingleton он кэширует iamge в LruCache и diskCache.you называют два ясный метод, если ясно, как? вы должны это проверить.

+0

Я не использую оба чистых метода, пробовал один за другим, но никто из них не работает. –

+1

вы попробуете этот метод getRequestQueue(). GetCache(). Clear(), он очистит весь кеш – Roman

0

ваш вызов mVolleySingleton.getRequestQueue(). GetCache() возвращает НЕ ImageCache но кэш Http (один из сети)

вы должны получить доступ к одной, объявленной в imageLoder

public LruCache<String, Bitmap> cache = new LruCache<>((int) (Runtime.getRuntime().maxMemory()/1024)/8); 

, то вы можете позвонить:

cache.evictAll() 

стереть все кэш или

cache.remove(urlProfileImage) 

, чтобы удалить 1 пункт только

0

Обновление Залп ImageLoader кэша для конкретного URL

1.Download Изображение с андроид способом после загрузки

метод

2.Place UpdateImageInCache в ImageLoader.java свежий образ файл

3.Удалить метод getCacheKey в файле ImageLoader.java

new ProfileActivity.DownloadImageFromURL((CircleImageView)findViewById(R.id.user_profile_module_photo)).execute(profileImageURL); 

private class DownloadImageFromURL extends AsyncTask<String, Void, Bitmap> { 
    CircleImageView imageView; 

    public DownloadImageFromURL(CircleImageView imageView) { 
     this.imageView = imageView; 
     //Toast.makeText(getApplicationContext(), "Please wait, it may take a few minute...", Toast.LENGTH_SHORT).show(); 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String imageURL = urls[0]; 
     Bitmap bimage = null; 
     try { 
      InputStream in = new java.net.URL(imageURL).openStream(); 
      bimage = BitmapFactory.decodeStream(in); 
      if (imageLoader == null) 
       imageLoader = AppController.getInstance().getImageLoader(); 
      // imageLoader.UpdateImageInCache("#W0#H0#S7"+profileImageURL,bimage); 
       imageLoader.UpdateImageInCache(profileImageURL,bimage); 

     } catch (Exception e) { 
      Log.e("Error Message", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return bimage; 
    } 

    protected void onPostExecute(Bitmap result) { 
     imageView.setImageBitmap(result); 
    } 

} 

public void UpdateImageInCache(String cacheKey, Bitmap response) 
{ 

     mCache.putBitmap(cacheKey, response); 
     // remove the request from the list of in-flight requests. 
     BatchedImageRequest request = mInFlightRequests.remove(cacheKey); 

     if (request != null) { 
      // Update the response bitmap. 
      request.mResponseBitmap = response; 

      // Send the batched response 
      batchResponse(cacheKey, request); 
     } 
} 


public static String getCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType) { 

    return url; 
    //return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) 
     // .append("#H").append(maxHeight).append("#S").append(scaleType.ordinal()).append(url) 
      // .toString(); 
} 
0

В LruBitmapCache вы должны сделать сНаЫе put(url, bitmap):

@Override 
    public void putBitmap(String url, Bitmap bitmap) { 
     // put(url, bitmap); 
    } 

этим способом каждый раз, когда вы вызываете метод залпа изображения не экономят, чтобы поймать