2016-03-27 74 views
1

我正在研究一個具有上傳配置文件圖像功能的android應用程序。我面臨的問題是每當用戶嘗試上傳新的配置文件圖像時,它都會成功上傳到lserver,但嘗試通過排空庫加載新圖像並不反映新圖像,ImageView仍會顯示舊圖像。爲了更加清晰,我也粘貼了抽象單例類實現。Android排球圖像url緩存不清除

我試着使用下面提到的兩種方法清除緩存,但它不起作用。也嘗試通過invalidate()方法使ImageView失效,但是這也不起作用,所以看起來更像是一個android緩存問題。

如果有人遇到類似的情況,請幫助。

1)mVolleySingleton.getRequestQueue()。getCache()。invalidate(urlProfileImage,true);
2)mVolleySingleton.getRequestQueue()。getCache()。remove(urlProfileImage);

凌空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; } @覆蓋 公共無效putBitmap(字符串URL,位圖位圖){} });' – BNK

+0

即使我禁用像你建議的緩存,我仍然無法看到更新的圖像。 –

回答

0

第一,像你VolleySingleton它會緩存iamge在LruCache和diskCache.you如果打電話都清楚兩個明顯的方法是什麼?你必須檢查它。

+0

我沒有使用這兩種清晰的方法,一一嘗試,但沒有一個能夠正常工作。 –

+1

你試試這個方法getRequestQueue()。getCache()。clear(),它會清除所有的緩存 – Roman

0

您的來電mVolleySingleton.getRequestQueue()。getCache()返回NOT的ImageCache但HTTP緩存(一個來自網絡)

您需要訪問一個你imageLoder宣佈

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

那麼你可以撥打:

cache.evictAll() 

刪除所有緩存或

cache.remove(urlProfileImage) 

上傳新鮮圖像

2.Place UpdateImageInCache方法在ImageLoader.java後除去1個項目僅

0

更新排球ImageLoader的緩存爲特定URL

1.Download圖像的機器人方式文件

3.在ImageLoader.java文件中更新getCacheKey方法

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); 
    } 

通過這種方式每次調用凌空方法圖像不保存時間趕上