2014-06-23 22 views
0

我有一個gridview只包含從使用Volley庫服務器動態加載的圖像。 佈局文件:停止從緩存(包含android排球圖像的GridView)loding圖像

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/grid_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:numColumns="auto_fit" 
android:columnWidth="90dp" 
android:horizontalSpacing="10dp" 
android:verticalSpacing="10dp" 
android:gravity="center" 
android:stretchMode="columnWidth" > 
</GridView> 

所以我'使用下載具有抽射圖像適配器加載所有從服務器中的映像:

public class ImageAdapter extends ArrayAdapter<Album>{ 
String urlImage; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

// Constructor 
public ImageAdapter(Activity activity, List<Album> items) { 
    super(activity, R.layout.custum_grid_view_item, items); 
} 

    @Override 
public View getView(int position, View convertView, ViewGroup parent) {   
    Activity activity = (Activity) getContext(); 
    LayoutInflater inflater = activity.getLayoutInflater(); 
    View rowView = inflater.inflate(R.layout.custum_grid_view_item, null); 
    Album item = getItem(position); 


    final ImageView myImageOfItemList = (ImageView) rowView 
      .findViewById(R.id.image_grid_view); 

     urlImage =item.getImage(); 

    myImageOfItemList.setTag(urlImage); 


    imageLoader.get(urlImage, new ImageListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
        myImageOfItemList.setImageDrawable(getContext() 
           .getResources().getDrawable(R.drawable.ic_home)); 
      Log.e("ImageLoadError", "Image Load Error: " + error.getMessage()); 
      } 

      @Override 
      public void onResponse(ImageContainer response, boolean arg1) { 
      if (response.getBitmap() != null) { 
      // load image into imageview 
       myImageOfItemList.setImageBitmap(response.getBitmap()); 
      } 
      } 
      }); 
    return rowView; 
} 

    } 

問題是Android應用的用戶訪問剛過gridView,如果圖像在服務器中更新,則舊圖像總是存儲在緩存中,因此用戶在第一次訪問gridView項目後永遠不會獲得更新的版本

我嘗試清除,刪除和拒絕緩存:

AppController.getInstance().getRequestQueue().getCache().remove(url); 
AppController.getInstance().getRequestQueue().getCache().invalidate(url, true); 
MemoryCacheUtil.removeFromCache(imageUri, imageLoader.getMemoryCache()); 

但它總是一樣的,即使我總是重新加載我的活動的「onResume」中的數據。 所以,如果一個圖像被添加或刪除它工作正常,但是當我改變它總是舊的顯示。

回答

2

Volley在磁盤上緩存圖像的方式取決於HTTP緩存標頭。如果緩存標題表示圖像仍然有效,則不會再從服務器請求該圖像。

處理圖像IMO的正確方法是通過以下邏輯: 更新服務器上的映像時,請將其視爲不是更新,而是添加。爲圖像指定一個不同的名稱,例如爲該名稱添加時間戳,以允許應用程序「知道」它需要從服務器檢索它。

緩存正在爲您工作,通過更快地加載圖像來實現更平滑的體驗。你想盡可能地使用它,只有在真正需要的時候纔會去網絡。

考慮這種情況:

  1. 用戶打開應用程序。
  2. Grid cube no.1需要加載example.com/image_20140614.jpg。
  3. Volley檢查緩存,圖像不存在,因此網絡請求被執行並且圖像被緩存。
  4. 經過X次的時間用戶再次打開應用程序。
  5. Grid cube no.1需要加載example.com/image_20140614.jpg。
  6. Volley快速檢查緩存並從磁盤加載映像。
  7. 經過X次的時間用戶再次打開應用程序。
  8. Grid cube no.1需要加載example.com/image_20140622.jpg。你認爲這是一個更新,但實際上它是一個新的圖像(注意時間戳)。
  9. 排空檢查緩存,圖像不存在,所以執行網絡請求並且圖像被緩存。

如果你控制服務器,那就是要走的路。 但是,如果您不這樣做,則需要更改Volley的緩存策略以檢查圖像是否發生了任何更改。

+0

嗯,我通過添加圖像和更改名稱,它工作正常,但在我的情況下最好的做法是什麼在每次更新後刪除緩存或更改名稱(這意味着另一個要求數據庫刪除然後添加另一個圖像名稱)? – BiLL

+0

不要考慮管理緩存。齊利照顧它。讓您的內存緩存儘可能大,並且磁盤緩存的默認大小爲5MB,這非常合理。 –

+0

ok謝謝你的回答很有幫助(接受...) – BiLL