我必须下载一些图像并使用图库显示它们。对于我用于库的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);
}
答案 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