我正在尝试使用AsyncTask将图像URL转换为位图,以便将其设置为图像。我不明白如何从AsyncTask中获取位图,以便我可以将其设置为我在循环中创建的图像。我也尝试将位图设置为AsyncTask中的图像。我的理解是一切都必须在AsyncTask中完成,但我无法引用我想设置值的图像。
我已经研究了位图转换的URL和AsyncTask,但我无法弄清楚如何将它们组合起来得到我想要的东西。这必须是一项相当普遍的任务。为什么这么难?
如何在AsyncTask中引用我的图像?
我可以返回我的位图,然后将其设置为AsyncTask之外的图像吗?
是否有更简单的方法将网址设置为图片来源?
到目前为止,我已经包含了我的内容。
感谢您的帮助并花时间阅读本文。
class BitmapTaks extends AsyncTask<String, Void, Bitmap> {
public Bitmap doInBackground(String... urls) {
Bitmap bm = null;
try {
URL aURL = new URL(urls[0]);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e("img", "Error getting bitmap", e);
}
return bm;
}
protected void onPostExecute(Bitmap bm) {
//do something after execute
}
}
答案 0 :(得分:2)
只需定义链接到要用Bitmap填充的视图的最终ImageView变量:
//inside some method e.g. onCreate()
final ImageView imageView = (ImageView) findViewById(R.id.myPrettyImage);
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
/* here's your code */
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);
}
}.execute(/*your params*/);
或者您可以在AsyncTask扩展任务中创建ImageView字段:
private class ExtendedAsyncTask extends AsyncTask<String, Void, Bitmap> {
private ImageView[] views;
public void ExtendedAsyncTask(ImageView[] views) {
this.views = views;
}
@Override
protected Bitmap doInBackground(String... params) {
/* your code here */
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
for (ImageView view: views) {
view.setImageBitmap(bitmap);
}
}
}
并使用它:
ExtendedAsyncTask aTask = new ExtendedAsyncTask(new ImageView[]{myImageView1, myImageView2, myImageView3});
aTask.execute(/*some params*/);
答案 1 :(得分:1)
这必须是一项相当普遍的任务。为什么这么难?
我真的建议您查看Android Volley library。它是为了抽象掉所有这些AsyncTask样板代码。这是一个如何设置图像位图的非常好的例子
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
// If you are using normal ImageView
imageLoader.get(Const.URL_IMAGE, new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Image Load Error: " + error.getMessage());
}
@Override
public void onResponse(ImageContainer response, boolean arg1) {
if (response.getBitmap() != null) {
// load image into imageview
imageView.setImageBitmap(response.getBitmap());
}
}
});
您可以在此处阅读更多内容:http://www.androidhive.info/2014/05/android-working-with-volley-library-1/