| 

.NET C# Java Javascript Exception

1
Hallo,

ich habe eine UI Klasse, welche weitere Klassen zur Auswertung einer Datenbank anspricht. Diese Abarbeitung habe ich in einen neuen Thread ausgelagert. Für die Kommunikation zwischen den beiden Threads habe ich einen Handle eingerichtet. In den angesprochenen Klassen übergebe ich den Handle Zwischenstandmeldungen um die Progressbar zu aktualisieren.

Nun sehe ich aber in LogCat, dass der Worker Thread schön die Daten an den Handle sendet. Dieser aber erst wird from UI Thread bearbeitet werden, wenn der Worker Thread beendet ist.

Wo mache ich was falsch oder ist der Ansatz schon falsch?
public class HydrantenUI extends ListActivity{

//Schnittstelle Datenbank
private HydrantenOpenHandler openHandler;

//Schnittstelle Worker Thread
Handler ProgressBarHandler;

//für die Listenansicht
private Cursor dbCursor;

//bildet den Cursor auf dem ListView ab
private HydrantenAdapter listAdapter;

public static ProgressDialog dialog;



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hydranten);


final Context context = this;
dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMessage("Daten werden aufbereitet...");
dialog.setCancelable(false);
dialog.show();

//Handler initialisierung
ProgressBarHandler = new Handler(){
public void handleMessage(Message msg){
int total = msg.getData().getInt("total");
dialog.setProgress(total);
Log.d("Handleservice", "Handle empfängt: " + msg + " Inhalt: " + total);
if(total == 100){
dialog.dismiss();
setListAdapter(listAdapter); //Sorgt für das Durchlaufen durch die Liste
}

}
};

new Thread(new Runnable() {

public void run() {

openHandler = new HydrantenOpenHandler(context);
try {
openHandler.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//openHandler.insert();

dbCursor = openHandler.query();
//System.out.println(dbCursor);

//Activity übernimmt Verwaltung des Cursors
startManagingCursor(dbCursor);
listAdapter = new HydrantenAdapter(context, dbCursor, ProgressBarHandler);
}
}).start();

Log.d("Threadproblematik", "Haupt Thread");
//setListAdapter(listAdapter); //Sorgt für das Durchlaufen durch die Liste


}

@Override
protected void onDestroy(){
super.onDestroy();
openHandler.close();
}

}


Stefan
News:
25.07.2012
DTAG 170 1 8
1 Antwort
0
Hallo Stefan,

eigentlich eher ein Kommentar als eine Antwort:

Ich fürchte, ohne die Code-Stelle, wo handleMessage aufgerufen wird, wird sich das nicht beantworten lassen. D.h Du solltest die relevanten Teile von HydrantenAdapter posten.

Ansonsten gibt es ein paar Unsauberheiten und Merkwürdigkeiten in Deinem Code:

  • Ich hab erst gedacht, Du hättest einen Syntaxfehler drin, bis ich geschnallt habe, dass ProgressBarHandler ein Feld ist, kein Typ. Wenn Du willst, dass Fremde sich in Deinem Code zurechtfinden, dann halte ich Dich an die Konventionen (in diesem Falle: Kleinschreibung).
  • listAdapter wird erst dann initialisiert sein, wenn der Konstruktor von HydrantenAdapter fertig ist, d.h. wenn der Aufruf zurückkehrt. Danach passiert in Deinem Hintergrundthread aber nichts mehr. Sollte irgendwer schon vorher handleMessage aufrufen, wird listAdapter dort noch null sein.
  • Aus einer Instanzmethode heraus ein statisches Feld zu manipulieren, so wie Du es mit dialog tust, ist im besten Fall schlechter Stil und im schlimmsten Fall die Ursache für scheußlich schwer zu findende Bugs.
25.07.2012
Matthias Hlawatsch 13,2k 4 9
Hallo Matthias,

ich habe das ganze Programm jetzt noch mal abgeändert. Wie kann ich das jetzt am Besten hier einbringen? In der Kommentarfunktion kann ich keinen Code kenntlich machen.
DTAG 26.07.2012
Und wie kann man sich bei Kommentaren benachrichtigen lassen? ;-)
DTAG 26.07.2012
Benachrichtigt wird man nur bei Kommentaren zu eigenen Fragen/Antworten
puls200 26.07.2012
@puls200: um genau zu sein: bei eigenen Fragen und solchen, bei denen man "Folgen" angeklickt hat, wird man über alle Kommentare und Antworten benachrichtigt. Ansonsten bei Kommentaren zu eigenen Antworten. Benachrichtigungen bei Edit gibt es leider gar nicht :-(
Matthias Hlawatsch 26.07.2012
@Stefan: editiere Deine Frage, kennzeichne das hinreichend verständlich und weise per Kommentar an der Frage darauf hin (-> Benachrichtung für Follower, Nach-Oben-Rutschen auf der Homepage). Falls Du Stellen geändert hast, auf die ich mich beziehe, wäre auch ein Kommentar an dieser Antwort hilfreich.
Matthias Hlawatsch 26.07.2012

Stelle deine Android-Frage jetzt!