Hallo,
hoffe hier gibt es den ein oder anderen, der mit Android vertraut ist, habe da nämlich ein Problem
.
Ich versuche seit Tagen einen ProgressDialog zusammen zu frickeln, der so lange rödelt, bis eine weitere Activity vollständig erzeugt wurde (über einen startActivity() Intent).
Das Problem dabei ist nicht mal der ProgressDialog oder der AsyncTask an sich, sondern eher die Kombination aus allen.
Was ich habe:
Activity A erzeugt einen neuen Intent (bei Click auf ein ListItem) welcher in einem AsyncTask ausgeführt wird.
In diesem AsyncTask wird dann in der onPreExecute() ein indeterminate ProgressDialog erzeugt.
Sobald die Activity B fertig initialisiert wurde, soll sich der ProgressDialog beenden.
Soweit zum gewünschten Ablauf.
Dieser funktioniert auch soweit "problemlos". Das Problem an der ganzen Sache ist, dass der ProgressDialog zwar angezeigt wird, aber nicht animiert wird (das Rad dreht sich nicht).
Der Thread scheint also zu hängen, bis dann die Activity B fertig initialisiert wurde, dann verschwindet der ProgressDialog sofort und die View "switcht" zur Activity B
.
Bei google konnte ich einige ähnliche Probleme finden, wo geraten wurde, den AsynchTask in die onCreate() Methode der Activity B aus zu lagern, dies führt bei mir jedoch zu unzähligen Exceptions die ich nicht gelöst bekomme.
Activity B besteht btw nur aus einer MapView (auf OSM adaptiert), muss also bei Erzeugung erstmal die MapTiles von OSM saugen, was ne Zeit dauert.
Hier noch Codeausschnitte aus Activity A und deren AsyncTask zum starten von Activity B:
Code:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// Get the item that was clicked
Object o = this.getListAdapter().getItem(position);
String keyword = o.toString();
if (keyword.startsWith("Map")) {
// Intent launch_traismap_Intent = new Intent(Trais.this, TraisMap.class);
// Trais.this.startActivity(launch_traismap_Intent);
new BackgroundWorker().execute(keyword);
}
....
}
Und hier der Worker:
Code:
private class BackgroundWorker extends AsyncTask<String, Void, Boolean> {
private ProgressDialog pd;
protected Boolean doInBackground(String... params) {
if(params[0].startsWith("Map")) {
Intent launch_traismap_Intent = new Intent(Trais.this, TraisMap.class);
Trais.this.startActivity(launch_traismap_Intent);
}else if(params[0].startsWith("POIs")) {
Intent launch_pois_own_Intent = new Intent(Trais.this, PoisOwn.class);
Trais.this.startActivity(launch_pois_own_Intent);
}
return true;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPreExecute()
*/
protected void onPreExecute() {
// Things to be done before execution of long running operation. For example showing ProgessDialog
pd = ProgressDialog.show(Trais.this, "Bitte warten...", "Downloading Data...", true, false);
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
protected void onPostExecute(Boolean result) {
// execution of result of Long time consuming operation
pd.dismiss();
}
}
Bin für jede creative Idee dankbar...