2014-09-10 46 views
0

我有一個GridView必須加載大量的項目(約300)與圖像,這些圖像使用UniversalImageLoader從互聯網下載。我的問題是關於內存(OutOfMemoryException)。圖像管理大型GridView(OutOfMemoryException)

這是我的適配器代碼:

public View getView(int position, View convertView, ViewGroup viewGroup) { 


    View v = convertView; 

    ViewHolder vh = null; 
    if (v == null) { 
     v = View.inflate(context, R.layout.item_gridview, null); 

     vh = new ViewHolder(); 
     vh.imageView = (ImageView) v.findViewById(R.id.imagenCategoria); 

     v.setTag(vh); 

     TextView nombreElemento = (TextView) v.findViewById(R.id.nombreElemento); 
     nombreElemento.setText(elementos.get(position).getTitulo()); 

     TextView infoElemento = (TextView) v.findViewById(R.id.infoElemento); 
     infoElemento.setText(elementos.get(position).getCalidad()+" "+elementos.get(position).getLenguaje()+" "+elementos.get(position).getAnho()); 



    }else { 
     vh = (ViewHolder)v.getTag(); 
    } 

    ImageAware imageAware = new ImageViewAware(vh.imageView, false); 
    String coverUrl = elementos.get(position).getUrlCover(); 
    if(coverUrl!=null && !coverUrl.equals(""))imageLoader.displayImage(coverUrl, imageAware); 


    return v; 
} 

private class ViewHolder { 
    ImageView imageView; 
} 

這就是我的ImageLoader的對象的配置:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      .cacheOnDisc(true) 
      .cacheInMemory(true) 
      .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
      .bitmapConfig(Config.RGB_565)    .resetViewBeforeLoading(true) 
      .build(); 

    ImageLoaderConfiguration configs = new ImageLoaderConfiguration.Builder(
      context.getApplicationContext()) 
      .memoryCache(new WeakMemoryCache()) 
      .discCacheSize(104857600) 
      .defaultDisplayImageOptions(defaultOptions) 
      .imageDownloader(new HttpClientImageDownloader(c, new DefaultHttpClient(manager, params))).threadPoolSize(10).build(); 

    imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(configs); 

有誰知道解決的辦法?最好。

+0

您可以在光盤或清除緩存onLowMemory()緩存調用@覆蓋 \t公共無效onLowMemory(){ \t \t ImageLoader.getInstance清除緩存() ().clearMemoryCache(); \t \t super.onLowMemory(); \t} – 2014-09-10 10:37:34

回答

0

您可以在onLowMemory致電

@Override 
    public void onLowMemory() { 
     ImageLoader.getInstance().clearMemoryCache(); 
     super.onLowMemory(); 
    } 
+0

嗨,我已經試過這種方法,但我認爲它不工作,因爲該方法是在整個系統內存不足時執行,而不是我的應用程序。當沒有顯示該項目時,是否有任何方法可以隱藏項目的位圖?因爲當我滾動時,所有位圖都是可見的,所以當我滾動時它們不會被充電。 – aloj 2014-09-10 11:14:51

+0

你是否在適配器類中爲getView創建了viewholder? – 2014-09-10 11:45:06

+0

你可以刪除.cacheInMemory(true) – 2014-09-10 11:45:51