簡體   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