【问题标题】:How do I get a bitmap from AsyncTask and set it to my image如何从 AsyncTask 获取位图并将其设置为我的图像
【发布时间】:2014-05-29 18:17:00
【问题描述】:

我正在尝试使用 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


}
}

【问题讨论】:

  • 您可以将您的位图从异步的 doInBackground 返回到 onPostExecute,就像您正在做的那样。有什么问题?
  • 使用毕加索,简单易行。 (此外,您的代码中只缺少最后一点代码(将位图设置为图像视图),您几乎就在那里。)
  • 你在正确的轨道上。

标签: java android url bitmap android-asynctask


【解决方案1】:

只需定义最终的 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*/);

【讨论】:

  • 我将我的图像视图声明为最终视图,但在我的 AsyncTask 的 onPostExecute 部分中,我收到一条消息,说我的视图变量无法解析。为什么我声明为最终视图后看不到我的视图?
  • 你能调试一下看看它是否为空吗?还是编译时错误?
  • 这是一个编译时错误。它不知道我要参考什么。它也不知道 AsyncTask 中的 findViewById 是什么。
  • view 应该在 Activity/View 范围的方法中声明为 final。 gist.github.com/togramago/ccfb1f6bd2dd9622a114
  • 在返回中,您使用 R.drawable.adjust_background 作为参数。我收到一条消息,它无法解决。为什么使用该参数?为什么我会收到错误消息?这是我需要创建的东西吗?
【解决方案2】:

这必须是一项相当普遍的任务。为什么这么难?

我真的建议您查看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/

【讨论】:

  • 什么是 AppController 对象?我找不到它的导入。它是另一个对象的实例吗?
  • 非常感谢这对您有很大帮助。
  • @lock -- 我什至想知道这个 AppController 对象是什么?我收到了一个错误。你是如何解决这个问题的?如果您能告诉我,那就太好了。
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多