2

在java中,我想一次为我的imageview下载多个图像。我发现这段代码确实如此,但它只下载第一个图像。我认为这与 doInBackground 中的第一行有关。如何调整此代码,使其循环 imageViews 并下载 imageViews 的每个图像。

package com.denederlandsewateren.daos;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

public class DownloadImageTaskDAO extends AsyncTask<ImageView, Void, Bitmap> {

    ImageView imageView = null;

    @Override
    protected Bitmap doInBackground(ImageView... imageViews) {
        this.imageView = imageViews[0];
        return download_Image((String)imageView.getTag());
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

    private Bitmap download_Image(String url) {
        //---------------------------------------------------
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            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("Hub","Error getting the image from server : " + e.getMessage().toString());
        } 
        return bm;
        //---------------------------------------------------
    }

}

从这里调用:

public void setImages(String url1, String url2) {
        image1.setTag(url1);
        image2.setTag(url2);
        DownloadImageTaskDAO imageDAO = new DownloadImageTaskDAO();
        imageDAO.execute(image1, image2);
    }
4

3 回答 3

4
@Override
protected Bitmap doInBackground(ImageView... imageViews) {
    this.imageView = imageViews[0];
    return download_Image((String)imageView.getTag());
}

您只处理发送到 AsyncTask 的第一个参数。使用该参数ImageView...,您可以发送一个、两个、N 个元素或数组。循环遍历参数并处理每个参数。

您可以使用 return from doInBackground、inonPostExecute和我个人尝试尽可能多地利用它来进行封装

总的来说,我建议您阅读 Android Developers 上的AsyncTask参考,以更好地了解 AsyncTasks。

我确实重写了你的代码,下面理论上应该可以工作(它没有经过测试)。

public class DownloadImageTaskDAO extends AsyncTask<ImageView, Void, ArrayList<DownloadImageTaskDAO.Container>> {

    @Override
    protected ArrayList<Container> doInBackground(ImageView... imageViews) {
         ArrayList<Container> results = new ArrayList<Container>(imageViews.length);

         for (ImageView imageView : imageViews) {
             Container tmp = new Container();
             tmp.holder = imageView;
             tmp.image = download_Image(imageView.getTag().toString());
             results.add(tmp);
         }

         return results;
    }

    @Override
    protected void onPostExecute(ArrayList<Container> result) {
        for (Container container : result) {
            container.holder.setImageBitmap(container.image);
        }
    }

    private Bitmap download_Image(String url) {
        ....
    }

    class Container {
        ImageView holder;
        Bitmap image;
    }
}
于 2013-01-16T17:00:38.393 回答
1

不要使用 AsyncTask,而是考虑使用带有 ResultReceiver 的 IntentService 作为额外的服务传递。IntentService 在负载下表现更好(比如下载多个图像),因为它们使用 HandlerThread 而不是使用 ThreadPoolExecutor 的 AsyncTask。

意向服务

结果接收器

于 2013-01-16T16:53:53.050 回答
0

我建议这种方式来实现你的代码

希望它对您Multiple images通过单个AsyncTask呼叫下载有所帮助。

异步任务调用方法

public void setImages(String[] urls)
{
   DownloadImageTaskDAO imageDAO = new DownloadImageTaskDAO();

   if(int i= 0; i< urls.lenght();i++)
   {
        image.setTag(urls[i]);
        imageDAO.execute(image).get();
    }
}

下载ImageTaskDAO 类:

public class DownloadImageTaskDAO extends AsyncTask<ImageView, Void, Bitmap> {

    ImageView imageView = null;

    @Override
    protected Bitmap doInBackground(ImageView imageView) {
        this.imageView = imageView;
        return download_Image((String)imageView.getTag());
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

    private Bitmap download_Image(String url) {
        //---------------------------------------------------
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            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("Hub","Error getting the image from server : " + e.getMessage().toString());
        } 
        return bm;
        //---------------------------------------------------
    }

}
于 2013-01-16T16:49:27.740 回答