使用异步任务下载图像并在Gallery中显示它

时间:2013-01-16 11:11:58

标签: android multithreading image uiimageview

我必须下载一些图像并使用图库显示它们。对于我用于库的Image适配器,我必须使用Async任务开始在get view方法中下载图像。我的问题是我无法将下载的图像视图返回给调用函数。由于networkonmainthread异常,我无法使用主线程下载。

GalleryActivity

public class GalleryActivity extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.gallery);
        ((Gallery) findViewById(R.id.gallery)).setAdapter(new ImageAdapter(this));
     }

图像适配器

public class ImageAdapter extends BaseAdapter { 

    public View getView(int position, View convertView, ViewGroup parent) {     
        new galleryBackground().execute(Integer.toString(position));
        ImageView i =null;
        return i;
    }

}

public class galleryBackground extends AsyncTask<String, Integer, String> { 
  Bitmap bm;    
  public String[] myRemoteImages = { ....};
  ImageView i = new ImageView(GalleryActivity.this);

  @Override
  protected String doInBackground(String... arg0) { 
      try { 
          URL aURL = new URL(myRemoteImages[Integer.parseInt(arg0[0])]);
          URLConnection conn = aURL.openConnection();

          conn.connect();
          InputStream is = conn.getInputStream();
          BufferedInputStream bis = new BufferedInputStream(is);
          bm = bitmapFactory.decodeStream(bis);
          bis.close();
          is.close();   
      }

  @Override     
  protected void onPostExecute(String result) {
     i.setImageBitmap(bm);
     i.setScaleType(ImageView.ScaleType.FIT_CENTER);
     i.setLayoutParams(new Gallery.LayoutParams(150, 150));
     // i have to return this Image view to the calling function        
     super.onPostExecute(result);   
}

4 个答案:

答案 0 :(得分:2)

此库将解决您的问题:

https://github.com/xtremelabs/xl-image_utils_lib-android

将JAR从该回购中拉入您的项目。

在Activity / Fragment中实例化ImageLoader并将其传递给适配器。

调用imageLoader.loadImage(imageView,url),所有内容都由该系统完成。

维基可以告诉你如何插入它。

答案 1 :(得分:1)

请注意:Lazy load of images in ListView

如何显示数据并不重要,您的适配器将是相同的。

答案 2 :(得分:1)

你应该从doingBackground();

返回bm
@Override
protected String doInBackground(String... arg0) {
    try{
        URL aURL = new URL(myRemoteImages[Integer.parseInt(arg0[0])]);
        URLConnection conn = aURL.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        bm = bitmapFactory.decodeStream(bis);
        bis.close();
        is.close();
        return bm;
    }
}

答案 3 :(得分:1)

将您的Asynctask更改为

AsyncTask<String, Integer, Bitmap>

将返回Bitmap和onPostExecute使用Bitmap 你已经传递了这个位置,所以onPostExecute你可以

yourlist.getItem(your position) and set the bitmap