# Beziehung von THIS beim Imageadapter und AsyncTask



## grafgarf (18. Jul 2011)

Hallo Zusammen....

ich suche mich gerade dummm und dämlich nach einem Fehler ... und sehe vor lauter Code schon das Programm nicht mehr ;-(

folgendes (Programm stark - aus das Wesendliche - verkürzt):



```
....
public Gallery gallery;

private class LongOperation extends AsyncTask<String, Void, String> {
	
	protected String doInBackground(String...params) {
		setzeBilder(); //****und das führt zum Absturz ;-(
		return null;
	}
}

public void GalleryMachen(){
	setzeBilder();	
}

public void setzeBilder(){
	gallery.setAdapter(new ImageAdapter(this));  //****hier liegt das Problem - vermutlich im "this"
}

public void GalleryAnzeigen(){	
        GalleryMachen(Bilder); //****Das funktioniert 
	new LongOperation().execute("");//****das hier nicht (s.o.)	 
}
   
public class ImageAdapter extends BaseAdapter {
    private Context myContext;
    
    String[] myRemoteImages = BildListe.split(",");
	
    public ImageAdapter(Context c) { this.myContext = c; }

    public int getCount() { return this.myRemoteImages.length; }

    public Object getItem(int position) { return position; }
    public long getItemId(int position) { return position; }
  
   public View getView(final int position, View convertView, ViewGroup parent) {
    	ImageView i = new ImageView(this.myContext);    
    	
        .........
   
    return i; }
```

aufgerufen wird über einen Button "GalleryAnzeigen();"

ich habe das ganze schon in viele einzelne Methoden geteilt, um das Problem einzugrenzen .... macht die Sache auf den ersten Blick etwas unübersichtlich ... 

sobald ich gallery.setAdapter(new ImageAdapter(this)) über den AsyncTask aufrufe, schmiert das Prog ab ... ich denke, dass das hier an der Beziehung zum "this" liegt ... finde aber kein Workaround bzw. dreh mich schon seit Stunden im Kreis ....

brauche einen Schubs in die richtige Richtung ;-)


----------



## Marco13 (19. Jul 2011)

Fehlermeldung/Stack Trace?


----------



## grafgarf (19. Jul 2011)

07-19 10:35:33.790: WARN/System.err(563): java.lang.IllegalStateException: Observer android.widget.AdapterView$AdapterDataSetObserver@40eaee08 was not registered.
07-19 10:35:33.790: WARN/System.err(563):     at android.database.Observable.unregisterObserver(Observable.java:64)
07-19 10:35:33.790: WARN/System.err(563):     at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42)
07-19 10:35:33.790: WARN/System.err(563):     at android.widget.AbsSpinner.setAdapter(AbsSpinner.java:102)
07-19 10:35:33.790: WARN/System.err(563):     at de.meinandroid.textdateilesen.textdateilesen.setzeBilder(textdateilesen.java:767)
07-19 10:35:33.790: WARN/System.err(563):     at de.meinandroid.textdateilesen.textdateilesen$LongOperation.doInBackground(textdateilesen.java:736)
07-19 10:35:33.790: WARN/System.err(563):     at de.meinandroid.textdateilesen.textdateilesen$LongOperation.doInBackground(textdateilesen.java:1)
07-19 10:35:33.790: WARN/System.err(563):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
07-19 10:35:33.800: WARN/System.err(563):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-19 10:35:33.800: WARN/System.err(563):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-19 10:35:33.800: WARN/System.err(563):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
07-19 10:35:33.800: WARN/System.err(563):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
07-19 10:35:33.800: WARN/System.err(563):     at java.lang.Thread.run(Thread.java:1020)


----------



## grafgarf (19. Jul 2011)

...muss wohl was damit zu tun haben, dass da nun der neue Thread (AsyncTask) auf das View eines anderen Threads (main) zugreift ... :noe:

...und mit einem Handler komm ich auch nicht ans Ziel ...


----------



## Marco13 (19. Jul 2011)

Bin mit Android nicht wirklich vertraut, aber ... wenn das ein Threading-Problem ist, könnte man das dann nicht vielleicht(!) lösen, indem man das Hinzufügen des Adapters mit einer der Methoden von Painless Threading | Android Developers (also View.post(Runnable) oder so...) auf den UI-Thread legt?
Ist wirklich nur ins Blaue geraten...


----------



## schlingel (25. Jul 2011)

Folgende Fragen:
1. Warum machst du das in einem eigenen Task? Wenn du die Daten für den Adapter dort initialisieren willst dann mach das auch aber du darfst auf den UI-Thread nur in den postExecute und updateProgress Methoden zugreifen.
2. this bezieht sich wirklich auf den Async-Task. Da hast du zwei Möglichkeiten: per Methode den Context reinkriegen den du haben möchtest oder das Design generell überdenken.

Ich glaube es würde auch helfen wenn du erklärst was genau du da eigentlich machen möchtest.


----------



## grafgarf (25. Jul 2011)

eigentlich wollte ich, dass ein Ladebalken kommt, wenn ich meine Datenbak durchforste und die Bilder zur Ansicht in die Gallery schubse ... 

Lösung (wobei ich bei Gelegenheit mal dem eigentlichen Problem auf den Grund gehen muss - hier geht es dann aber nur ums Prinzip) ... nunja ... der Code war jedenfalls zum besagten Zeitpunkt noch unoptimiert - und bei besagten  Abfragen gingen schon mal 30 Sekunden ins Land ... es wäre also ein Progressbar schon angebracht gewesen ... jetzt habe ich jedenfalls den Code so weit optimiert, dass die Antwortzeit im Milisekundenbereich liegt ... Progressbar also vollkommen fehl am Platz ...

werde aber diesbezüglich am Ball bleiben (für zukünftige Probleme)


----------



## schlingel (25. Jul 2011)

Ich verwende in solchen Fällen immer einen AsyncTask. Da kannst du im preExecute den Warte-Dialog mit Progressbar starten, im doInBackground deine Daten fetchen und im postExecute den Dialog schließen um die UI wieder frei zu geben.

Ein Beispiel findet man hier: AsyncTask für Serverzugriff


----------

