1

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

图库活动

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

4 回答 4

2

该库将解决您的问题:

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

将 JAR 从该 repo 拉到您的项目中。

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

调用 imageLoader.loadImage(imageView, url),一切都由该系统为您完成。

wiki 可以向您展示如何插入它。

于 2013-01-16T14:29:56.803 回答
1

看:ListView中图像的延迟加载

不管如何显示数据,你的适配器都是一样的。

于 2013-01-16T11:24:03.560 回答
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;
    }
}
于 2013-01-16T11:25:28.257 回答
1

将您的 Asynctask 更改为

AsyncTask<String, Integer, Bitmap>

这将返回您 Bitmap 和 onPostExecute 使用 Bitmap 您已经在传递位置,所以 onPostExecute 您可以

yourlist.getItem(your position) and set the bitmap 
于 2013-01-16T11:31:20.813 回答