2013-01-05 21 views
1

我正在使用gridview來顯示數百個圖像(可能甚至幾千)。這些圖像位於服務器上,我使用HttpResponseCache緩存圖像。我遇到的問題是,當我通過網格視圖向下滑動時,再循環視圖在最終解決正確的圖像之前顯示3張或更多圖像,每個子視圖。這似乎是回調方法返回所有請求圖像的結果。我怎樣才能讓gridview在上/下滾動時不會有這種巨大的活動旋風。我的自定義適配器的GridView性能與HttpResponseCache

getView方法設置圖像

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

     View v; 

     if (convertView == null) { 

      v = li.inflate(R.layout.folder_button, null); 
     } else { 
      v = convertView; 
     } 

     TextView tv = (TextView)v.findViewById(R.id.tvFolderButtonTitle); 

     tv.setText(mBaseItems[position].Name); 
     tv.setTextColor(Color.WHITE); 

     ImageView iv = (ImageView)v.findViewById(R.id.ivFolderButtonImage); 
     iv.setLayoutParams(new LinearLayout.LayoutParams(folderWidth_, folderHeight_)); 
     iv.setScaleType(ImageView.ScaleType.FIT_XY); 

     String imageUrl = "http://path.to.image"; 
     api_.GetImageAsync(imageUrl, new GetImageStreamCallback(iv), false); 

     return v;   
} 

回調方法。從api_.GetImageAsync稱爲上面

public class AsyncRequestImage extends AsyncTask<String,String,Object > { 

HttpURLConnection connection_; 
InputStream inStream_; 
IApiCallback callback_; 
boolean ignoreCache_; 

public AsyncRequestImage(IApiCallback callback, boolean ignoreCache) { 
    this.callback_ = callback; 
    this.ignoreCache_ = ignoreCache; 
} 

@Override 
protected Object doInBackground(String... uri) { 

    Bitmap image; 

    if (ignoreCache_) { 
     image = acquireImage(uri[0], true); 
    } else { 
     image = acquireImage(uri[0], false); 
     if (image == null) 
      image = acquireImage(uri[0], true); 
    } 

    return image; 
} 

@Override 
protected void onPostExecute(Object image) { 
    callback_.Execute(image); 
} 

private Bitmap acquireImage(String url, boolean ignoreCache) { 
    try { 
     URL _url = new URL(url); 

     connection_ = (HttpURLConnection) _url.openConnection(); 
     connection_.addRequestProperty("Accept-Encoding", "gzip"); 

     if (ignoreCache) { 
      connection_.setRequestProperty("Cache-Control", "max-age=0"); 
     } else { 
      connection_.addRequestProperty("Cache-Control", "only-if-cached"); 
     } 

     connection_.connect(); 

     String encoding = connection_.getContentEncoding(); 

     // Determine if the stream is compressed and uncompress it if needed. 
     if (encoding != null && encoding.equalsIgnoreCase("gzip")) { 

      try { 
       inStream_ = new GZIPInputStream(connection_.getInputStream());       
      } catch (FileNotFoundException e) { 

      } 

     } else { 

      try { 
       inStream_ = connection_.getInputStream(); 

      } catch (FileNotFoundException e) { 

      } 
     } 

     if (inStream_ != null) { 

      try { 
       Bitmap image = BitmapFactory.decodeStream(inStream_); 
       return image; 

      } catch (java.lang.OutOfMemoryError oom) {     
       FileLogger.getFileLogger().ReportInfo("UrlConnection: Bitmap creation failed. Out of memory");     
      }        
     }   

    } catch (IOException e) { 
     if (e != null && e.getMessage() != null) { 
      Log.i("AsyncRequestImage doInBackground:",e.getMessage()); 
     } 

    } finally { 
     connection_.disconnect(); 
    } 

    return null; 
} 

} 

回答

1

我是有問題的部分

public class GetImageStreamCallback implements IApiCallback { 

private ImageView currentImageView; 

public GetImageStreamCallback(ImageView imageView) { 
    currentImageView = imageView; 
} 

public void Execute(Object data) { 

    if (data != null) { 
     try { 
      Bitmap image = (Bitmap) data; 
      currentImageView.setImageBitmap(image); 
     } catch (Exception e) { 
      Log.i("Exception", "Error getting image"); 
     } 
    } 
} 

} 

定製的AsyncTask到一個未優化BaseAdapter.GetView是由於

此外,當用戶啓動拖動手勢,我仍然試圖加載所有的圖像作爲通過的意見。

This article!爲我所犯的每一個錯誤提供了詳細的描述和解決方案。在那篇文章中還有一個指向源代碼的鏈接,它提供了一種方法來停止加載圖像,直到抓取手勢完成。