2016-04-01 10 views
0

Ich habe Probleme beim Verständnis von AsyncTask. Ich sende einen Dateispeicherort an ihn, damit er ihn abrufen, seine Größe ändern und ihn zurückgeben kann. Wenn ich die asynctask-Klasse von meiner Aktivität, die eine BaseAdapter-ListView ist, aufrufen, erhalte ich einen Typenkonflikt.Abrufen einer BitMap von AsyncTask in Java

Ich dachte, dass ich die Bitmap aus der Ausführung zurückgeben könnte. Ich habe gelesen, dass ich die OnPostExecute() verwenden müssen, aber ich bin nicht sicher, wie ..

public class ImageHandler extends AsyncTask<String, Void, Bitmap> { 
     Bitmap sizedBMP = null; 
     @Override 

     protected Bitmap doInBackground(String... params) { 

      File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "/"+params[0]+"/"+params[0]+".png"); 
      if (imgFile.exists()){ 
       Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString()); 
       int newWidth = 500; 
       sizedBMP = getResizedBitmap(bmp, newWidth); 

      } 
      else{ 
       //set no image available 
      } 
      return sizedBMP; 

     } 

     @Override 
     // Once the image is downloaded, associates it to the imageView 
     protected void onPostExecute(Bitmap sizedBMP) { 

     } 


    public Bitmap getResizedBitmap(Bitmap bm, int newWidth) { 
     // Bitmap gets resized here..... 

     } 
} 

Ich rufe diese Klasse in der getView() wie:

ImageHandler imgHandler = new ImageHandler(); 
Bitmap bitMap; 
bitMap = imgHandler.execute(filename); 

Fehler:

Type mismatch: cannot convert from AsyncTask to Bitmap

+0

Jeder besondere Grund, warum Sie nicht [Picasso] (https://github.com/square/picasso), [Glide] (https://github.com/bumptech/glide), [Fresco] (https://github.com/facebook/fresco) oder eine andere Bildladebibliothek? –

+0

Nun, jemand schlug vor, glide, aber ich wollte lernen, wie es funktioniert, denke ich. – silversunhunter

Antwort

0

Die Methode .execute gibt die aktuelle AsyncTask zurück. Um das Ergebnis festzulegen, fügen Sie einen Konstruktor mit dem Parameter imageview hinzu, den Sie zum Anzeigen der Bitmap verwenden möchten.

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

     Bitmap sizedBMP = null; 
     ImageView imageView; 

     public ImageHandler(ImageView imageView){ 
      this.imageView = imageView; 
     } 

     @Override 
     protected Bitmap doInBackground(String... params) { 

      File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "/"+params[0]+"/"+params[0]+".png"); 
      if (imgFile.exists()){ 
       Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString()); 
       int newWidth = 500; 
       sizedBMP = getResizedBitmap(bmp, newWidth); 

      } 
      else{ 
       //set no image available 
      } 
      return sizedBMP; 

     } 

     @Override 
     // Once the image is downloaded, associates it to the imageView 
     protected void onPostExecute(Bitmap sizedBMP) { 
       if(sizedBMP != null){ 
        imageView.setImageBitmap(sizedBMP); 
       } 
     } 


    public Bitmap getResizedBitmap(Bitmap bm, int newWidth) { 
     // Bitmap gets resized here..... 

     } 
} 

und setzen Sie den Imageview im Konstruktor wie auf diese Weise:

ImageHandler imgHandler = new ImageHandler(myImageView); 
imgHandler.execute(filename); 

das funktioniert sollte, aber wenn Sie diese Art von Bild-Loader verwenden möchten, wenn Scroll-Listenansicht Sie andere Problem haben - Für einen einzelnen ImageView-Steckplatz in Folge werden sich einige Bitmaps für einige Sekunden gegenseitig ersetzen.

This Thema kann Ihnen dabei helfen.