2012-04-10 15 views
1

Ich versuche, Bilder in den Text neben dem Text in einer Listenansicht zu laden. Da das Scrollen ohne eine Asyntask ist schrecklich, versuche ich das zu implementieren. Leider gibt mir mein Code in onPostExecute() Nullzeigerfehler und ich kann nicht herausfinden, warum. Mein Code ist wie folgt:Laden von Bildern in Listenansicht

class LoadImage extends AsyncTask<Object, Void, Bitmap>{ 

    private ImageView imv; 
    private Object imageViewHolder; 
    private String position; 
    private Object path; 

    public LoadImage(ImageView imv, String _position) { 
     Log.w("MyApp", "creating LoadImage"); 
     this.imv = imv; 
     Log.w("MyApp", "got image view"); 
     path = imv.getTag(); 
     Log.w("MyApp", "Got Imageview Path"); 
     position = _position; 
     Log.w("MyApp", "LoadImage created"); 
    } 

    @Override 
    protected Bitmap doInBackground(Object... params) { 
     Log.w("MyApp", "in doInBackground"); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 2; 
     Log.w("MyApp", "made bitmap factory"); 

     Bitmap bm = null; 

     Log.w("MyApp", "Getting URL ID"); 
     File dir = new File(PATH + position); 
     Log.w("MyApp", "Have URL ID"); 

     if(dir.isDirectory()){ 
      Log.w("MyApp","Dir is a directory"); 

      File header = new File(dir.getAbsolutePath() + "/title"); 
      Log.w("MyApp", "Checking for title"); 
      if(header.isFile()){ 
       bm = BitmapFactory.decodeFile(header.getAbsolutePath(), options); 
      } 

      if(bm!=null){ 
       Log.w("MyApp", "Title is good"); 
      }else{ 
       Context c = ReadingList.this; 
       bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery); 
      } 
     }else{ 
      Log.w("MyApp", "Dir Not Directory"); 
      Context c = ReadingList.this; 
      bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery); 
     } 


     return bm; 
    } 
    @Override 
    protected void onPostExecute(Bitmap result) { 
     if (!imv.getTag().equals(path)) { 
      Log.w("MyApp", "Not setting images"); 
      return; 
     } 

     if(result != null && imv != null){ 
      Log.w("MyApp", "setting bitmap"); 
      imv.setImageBitmap(result); 
     }else{ 
      Log.w("MyApp", "Nothing happened"); 
     } 
    } 

} 

Das Problem, das ich mit bin kämpfe nicht im Stich gelassen Bitmaps zusammen mit der Recycling-Ansicht recycelt werden. Ich habe einige Beispiele auf dieser Seite angeschaut und bin mir nicht sicher, warum das nicht funktioniert. Eine Menge Code wurde aus der Antwort auf diese ausgeliehen. Der onPostExecute gibt nichts in das Protokoll ein und stürzt auch nicht sofort ab. Es dauert ungefähr zwei Minuten, um zu stürzen. Die Bilder werden von der SD-Karte gezogen, deshalb bin ich mir nicht sicher, warum es so lange dauert, um zu entscheiden, ob sie abstürzen will oder nicht.

in doInBackground 
made bitmap factory 
Getting URL ID 
Have URL ID 
Dir is a directory 
Checking for title 
Title is good 
in doInBackground 
made bitmap factory 
getting URL ID 
Have URL ID 
Dir is a directory 
Checking title 
Shutting down VM 
threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:305) 
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:1) 

Es geht auf den ersten 7 Zeilen mehrmals danach zu wiederholen, aber die App abgestürzt ist und ich kann nicht sehen, ob sie alles tun. onPostExecute scheint jedoch nie wieder aufgerufen zu werden.

Zum Vergleich:

304: if (!imv.getTag().equals(path)) { 
305: Log.w("MyApp", "Not setting images"); 
306: return; 
307: } 
+0

Bitte legen Sie das Logcat, damit wir Ihnen genauer helfen können. –

+0

Das Logcat und die referenzierten Zeilen hinzugefügt. Ich hoffe, das hilft. Nicht sicher, ob die Nullzeiger-Ausnahme ausgelöst wird. onPostExecute scheint im Bereich von imv und path zu liegen, und ich kann nicht sehen, wie entweder null wäre. –

+0

Kommentieren Sie die Linie 305 und sehen Sie dann, was passiert ist? –

Antwort

1

fand ich eine Lösung, die für mich funktioniert. Ich habe aQuery verwendet und das sentDelay- und async-Set-Image aus der Datei verwendet, die sie bereitstellen.

if(header.isFile() && !aq.shouldDelay(position, convertView, parent, 
    header.getAbsolutePath())){ 
    bm = BitmapFactory.decodeFile(header.getAbsolutePath(), options); 
    showcase.setImageBitmap(bm); 
} else {      
    showcase.setImageResource(R.drawable.missing_image); 
}