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...を使用すると、1 つ、2 つ、N 個の要素または配列を送信できます。引数をループして、それぞれを処理します。

からのリターンを使用できます 、doInBackgroundおよび個人的には、カプセル化onPostExecuteのためにできる限りそれを利用しようとしています。

全体として、 AsyncTasksの理解を深めるために、Android DevelopersのAsyncTaskリファレンスを読むことをお勧めします。

私はあなたのコードを書き直しましたが、以下は理論的には機能するはずです(テストされていません)。

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 は、ThreadPoolExecutor を使用する AsyncTasks とは対照的に HandlerThread を使用するため、負荷がかかった状態 (複数の画像のダウンロードなど) でパフォーマンスが向上します。

インテントサービス

結果受信者

于 2013-01-16T16:53:53.050 に答える
0

この方法でコードを実装することをお勧めします

Multiple images1回のAsyncTask呼び出しでダウンロードするのに役立つことを願っています。

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();
    }
}

DownloadImageTaskDAO クラス :

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 に答える