Question

Comment puis-je remplacer les lignes de code avec un AsyncTask suivants? Comment pouvez-vous « revenez » Bitmap du AsyncTask? Merci.

ImageView mChart = (ImageView) findViewById(R.id.Chart);
String URL = "http://www...anything ...";

mChart.setImageBitmap(download_Image(URL));

public static 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;
        //---------------------------------------------------

    }

Je pensais que quelque chose comme ceci:

remplacer:

mChart.setImageBitmap(download_Image(graph_URL));

par quelque chose comme:

mChart.setImageBitmap(new DownloadImagesTask().execute(graph_URL));

et

public class DownloadImagesTask extends AsyncTask<String, Void, Bitmap> {

@Override
protected Bitmap doInBackground(String... urls) {
    return download_Image(urls[0]);
}

@Override
protected void onPostExecute(Bitmap result) {
    mChart.setImageBitmap(result);              // how do I pass a reference to mChart here ?
}


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;
    //---------------------------------------------------
}


}

Comment puis-je passer une référence à mChart dans onPostExecute (résultat Bitmap) ??? Ai-je besoin de le transmettre avec l'URL d'une certaine façon? Je voudrais remplacer toutes mes lignes de code:

mChart1.setImageBitmap(download_Image(URL_1));
mChart2.setImageBitmap(download_Image(URL_2));

avec quelque chose de similaire ... mais de manière AsyncTask!

mChart1.setImageBitmap(new DownloadImagesTask().execute(graph_URL_1));
mChart2.setImageBitmap(new DownloadImagesTask().execute(graph_URL_2));

Y at-il une solution facile pour cela? Est-ce que je reçois quelque chose de mal ici?

Était-ce utile?

La solution

S'il n'y a aucune raison de télécharger l'image vous alors je vous recommande d'utiliser Picasso .

Picasso vous enregistre tous les problèmes avec le téléchargement, le réglage et la mise en cache des images. Le code tout le nécessaire pour un exemple simple est:

Picasso.with(context).load(url).into(imageView);

Si vous voulez vraiment faire tout ce que vous utilisez ma réponse ci-dessous plus.


Si l'image est pas grand, vous pouvez simplement utiliser une classe anonyme pour la tâche async. Cela comme ceci:

ImageView mChart = (ImageView) findViewById(R.id.imageview);
String URL = "http://www...anything ...";

mChart.setTag(URL);
new DownloadImageTask.execute(mChart);

La classe Tâche:

public class DownloadImagesTask 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) {
   ...
}

Hiding l'URL dans la balise est un peu difficile, mais il semble plus agréable dans la classe d'appeler si vous avez beaucoup de imageviews que vous voulez remplir cette façon. Il aide également si vous utilisez le ImageView dans un ListView et que vous voulez savoir si le ImageView a été recyclé pendant le téléchargement de l'image.

J'ai écrit si vous l'image est pas grand parce que cela se traduira par la tâche ayant un pointeur implicite à l'activité sous-jacente causant le collecteur d'ordures pour maintenir toute l'activité en mémoire jusqu'à ce que la tâche est terminée. Si l'utilisateur se déplace à un autre écran de votre application alors que le bitmap télécharge la mémoire ne peut pas être libéré et il peut rendre votre application et plus lent tout le système.

Autres conseils

Essayez ce code:

ImageView myFirstImage = (ImageView) findViewById(R.id.myFirstImage);
ImageView mySecondImage = (ImageView) findViewById(R.id.mySecondImage);
ImageView myThirdImage = (ImageView) findViewById(R.id.myThirdImage);

String URL1 = "http://www.google.com/logos/2013/estonia_independence_day_2013-1057005.3-hp.jpg";
String URL2 = "http://www.google.com/logos/2013/park_su-geuns_birthday-1055005-hp.jpg";
String URL3 = "http://www.google.com/logos/2013/anne_cath_vestlys_93rd_birthday-1035005-hp.jpg";


myFirstImage.setTag(URL1);
mySecondImage.setTag(URL2);
myThirdImage.setTag(URL3);


new DownloadImageTask.execute(myFirstImage);
new DownloadImageTask.execute(mySecondImage);
new DownloadImageTask.execute(myThirdImage);



public class DownloadImagesTask 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 bmp =null;
        try{
            URL ulrn = new URL(url);
            HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
            InputStream is = con.getInputStream();
            bmp = BitmapFactory.decodeStream(is);
            if (null != bmp)
                return bmp;

            }catch(Exception e){}
        return bmp;
    }
}

vous pouvez créer une say..BkgProcess de classe qui contient une classe interne qui s'étend AsyncTask. tandis que l'instanciation BkgProcess passer le contexte de votre classe d'activité dans le constructeur BkgProcess. pour exemple:

public class BkgProcess {

 String path;   
 Context _context;

public Download(Downloader downloader, String path2){

 this.path = path2;
    _context = downloader;

}

public void callProgressDialog(){

new BkgProcess().execute((Void)null);
}
class Downloads extends AsyncTask<Void, Void, Boolean> {
    private ProgressDialog dialog = new ProgressDialog(_context);
    protected void onPreExecute(){
        dialog.setMessage("Downloading image..");
        dialog.show();
    }

    protected void onPostExecute(Boolean success) {
        dialog.dismiss();
        if(success)
            Toast.makeText(_context, "Download complete", Toast.LENGTH_SHORT).show();
    }

@Override
protected Boolean doInBackground(Void... params) {
    return(startDownload(path));

    }


public boolean startDownload(String img_url) {

// download img..

      return true;
}
}
}

de votre classe d'activité ..

BkgProcess dwn = new BkgProcess (Your_Activity_class.this, img_path);

dwn.callProgressDialog();

vous obtiendrez des images de toute taille ... si vous ne voulez pas la boîte de dialogue de progression tout commentaire dans les codes OnPreExecute ();

for(int i = 0 ; i < no_of_files ; i++ )
 new FetchFilesTask().execute(image_url[i]);


private class FetchFilesTask extends AsyncTask<String, Void, Bitmap> {

    private ProgressDialog dialog = new ProgressDialog(FileExplorer.this);
    Bitmap bitmap[];
    protected void onPreExecute(){
        dialog.setMessage("fetching image from the server");
        dialog.show();
    }

     protected Bitmap doInBackground(String... args) {

             bitmap = getBitmapImageFromServer();
         return bitmap;
     }

     protected void onPostExecute(Bitmap m_bitmap) {
         dialog.dismiss();
         if(m_bitmap != null)
             //store the images in an array or do something else with all the images.   
     }
 }

public Bitmap getBitmapImageFromServer(){

    // fetch image form the url using the URL and URLConnection class
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top