繁体   English   中英

如何从AsyncTask获取位图并将其设置为图像

[英]How do I get a bitmap from AsyncTask and set it to my image

我正在尝试使用AsyncTask将图像URL转换为位图,以便将其设置为图像。 我不明白如何从AsyncTask中获取位图,以便可以将其设置为循环创建的图像。 我也尝试将位图设置为AsyncTask中的图像。 我的理解是,所有操作都必须在AsyncTask内部完成,但是我无法引用要为其设置值的图像。

我已经研究了URL到位图转换和AsyncTask的问题,但是我不知道如何将它们组合起来以获得我想要的东西。 这必须是相当常见的任务。 为什么这么难?

如何在AsyncTask中引用我的图像?

我可以返回位图,然后将其设置为AsyncTask外部的图像吗?

有没有更简单的方法将URL设置为图像源?

我已经包括了到目前为止的内容。

感谢您的帮助,并抽出宝贵的时间阅读本文。

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


}
}

只需定义链接到要使用位图填充的视图的最终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*/);

这必须是相当常见的任务。 为什么这么难?

我真的建议您看看Android Volley库 它可以抽象出所有这些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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM