ProgressDialog CSV Import

M

MBPower

Fortgeschrittenes Mitglied
11
Kann mir bitte jemand bei dem folgenden ProgressDialog helfen.
Der ProgressDialog wird richtig gestartet und läuft auch an, aber wenn mit dem Import der CSV begonnen wird, dann bleibt die Grafik vom ProgressDialog stehen. Die CSV wird aber weiter eingelesen.

Bei einem Upload funktioniert das ohne Probleme, aber leider nicht mit dem CSV Import.

Code:
public void test()
{
    // Display an indeterminate Progress-Dialog
    String info = "This process might take several minutes.";
    myProgressDialog = ProgressDialog.show(test1.this,"Please wait...", info, true);
    
    new Thread() { 
        public void run() { 
             try{ 
                  
             Thread.sleep(1000); 
             } catch (Exception e) {  } 
             
             runOnUiThread(new Runnable() { 
                 @Override 
                 public void run() { 
                     try { 
                        BufferedReader f;
                        String line;
                        int a = 0;
                        String array[] = new String[2];
                         
                        f = new BufferedReader(new FileReader("sdcard/test.csv"));

                        while ((line = f.readLine()) != null){
                            
                            StringTokenizer st = new StringTokenizer(line, ";");
                            if (array[0] == null) {array[0] = "";}
                            if (array[1] == null) {array[1] = "";}
                            while (st.hasMoreTokens()) {
                                array[a] = st.nextToken();
                                a++;
                            }
                            a=0;
                        }

                        f.close();
                     }catch (IOException e){

                     }
                     
                 }
                 });
             // Dismiss the Dialog 
             
             myProgressDialog.dismiss(); 
        } 
   }.start(); 
}
Ohne Thread.sleep(1000); hängt sich das App beim Import nach ein paar Sekunden auf und auch der Dialog wird nicht angezeigt.
Der Import funktioniert ohne Dialog auch problemlos, nur das App steht dann natürlich für XX Sekunden ohne Info.
 
Zuletzt bearbeitet:
dein vorgang an sich ist falsch... du machst nen thread, in dem du sämtliche berechnungen wieder in den UI Thread auslegst... was macht das fürn sinn? Keinen ;)
 
Aber auch der folgenden Code funktioniert nicht. Es wird nicht mal der Progress-Dialog angezeigt, aber auch kein Fehler. Der Import wird auch nicht ausgeführt.
Code:
public void test()
{
    
    // Display an indeterminate Progress-Dialog
    String info = "This process might take several minutes.";
    myProgressDialog = ProgressDialog.show(test1.this,
              "Please wait...", info, true);

    new Thread() {
         public void run() {
              try{
                BufferedReader f;
                String line;
                int a = 0;
                String array[] = new String[2];
                  
                f = new BufferedReader(new FileReader("sdcard/test.csv"));

                dropTable();

                while ((line = f.readLine()) != null){
                    
                    // cut String and delete "; "
                    StringTokenizer st = new StringTokenizer(line, ";");
                    if (array[0] == null) {array[0] = "";}
                    if (array[1] == null) {array[1] = "";}
                    while (st.hasMoreTokens()) {
                        array[a] = st.nextToken();
                        a++;
                    }
             
                    addItemDB(array[0], array[1]);
                    a=0;

                }

                f.close();
                  

              } catch (Exception e) {  }
              // Dismiss the Dialog
              myProgressDialog.dismiss();
         }
    }.start();
               
}
Der folgende Code funktioniert.
Code:
public void test()
{
    //Display an indeterminate Progress-Dialog
    String info = "This process might take several minutes.";
    myProgressDialog = ProgressDialog.show(test1.this,
              "Please wait...", info, true);

    new Thread() {
         public void run() {
              try{
                   //Do some Fake-Work
                   sleep(2000);

              } catch (Exception e) {  }
              // Dismiss the Dialog
              myProgressDialog.dismiss();
         }
    }.start();
}
 
Zuletzt bearbeitet:
Ich habe mein letztes Posting vor ein paar Minuten noch angepasst.
Den gleichen Progress-Dialog nutze ich schon für ein Upload, warum der nicht beim CSV Import funktioniert ist hier die Frage.
Warum der Progress-Dialog im ersten Code nicht aufgerufen wird kann ich nicht sagen, aber auch wird der Import nicht weiter ausgeführt.
 
Hast Du den catch Block jetzt nur für das Forum leer gemacht, oder ist der auch bei Dir leer? Wenn ja würde ich empfehlen da zumindest die Exception zu loggen. Ich hab mir den Code jetzt nicht vollständig angeschaut, würde aber mal vermuten da fliegt irgendwo eine Exception die durch den leeren catch-Block einfach verschluckt wird.
 
Mit dem folgenden Code im catch-Block stürzt das App ab.
Code:
AlertDialog (e.getMessage());

Fehlermeldung:
WARN/dalvikvm(1436): threadid=15: thread exiting with uncaught exception (group=0x4001e188)
ERROR/AndroidRuntime(1436): Uncaught handler: thread Thread-8 exiting due to uncaught exception
ERROR/AndroidRuntime(1436): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(1436): at android.os.Handler.<init>(Handler.java:121)
ERROR/AndroidRuntime(1436): at android.app.Dialog.<init>(Dialog.java:105)
ERROR/AndroidRuntime(1436): at android.app.AlertDialog.<init>(AlertDialog.java:63)
ERROR/AndroidRuntime(1436): at android.app.AlertDialog.<init>(AlertDialog.java:59)
ERROR/AndroidRuntime(1436): at android.app.AlertDialog$Builder.create(AlertDialog.java:786)

Kannst Du mir das richtige vorgehen vom loggen der Exception bitte kurz beschreiben.

Sehr komisch ist, dass beide Programmteile (Import und ProgressDialog) einzeln laufen, aber zusammen nicht.
 
Du solltest besser mit Log.d(lbl,msg) (oder in eine Datei auf der SD Karte) loggen, insbesondere, wenn Du UI-Thread Probleme debuggst.
 
Und im Catch-Block die Exception per
Log.e(String tag, String msg, Throwable tr) wegloggen,
also z.B.:
Log.e("Import", "Fehler beim Einlesen", e);
 
  • Danke
Reaktionen: MBPower
sorcerer schrieb:
Log.e("Import", "Fehler beim Einlesen", e);
Danke Dir.

Hoffentlich kann mir jemand bei dem Problem helfen, denn es wäre zu schade, wenn es am CSV-Import von ein paar Daten scheitern sollte.
Hier gibt es doch sooooo viele Android-Profis, da wird doch sicher jemand ein Lösung haben.

Hier die Fehlermeldung:
Fehler beim Einlesen
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
at android.view.ViewRoot.invalidateChild(ViewRoot.java:570)
at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:2396)
at android.view.View.invalidate(View.java:4945)
at android.widget.AbsListView.resetList(AbsListView.java:992)
at android.widget.ListView.resetList(ListView.java:478)
at android.widget.ListView.setAdapter(ListView.java:417)
 
Zuletzt bearbeitet:
nicht gleich jemanden der sich auskennt als freak bezeichnen, damit machst dir sicher keine freunde.

steht ja alles da.

du darfst nicht in einem anderen thread die UI elemente verändern. das darf nur der UI thread machen. Stichwort handler
 
Ahjo Problem erkannt, der Stacktrace hilft ungemein :)
Du versuchst innerhalb des Threads ne ListView zu manipulieren.
Das musst Du ausserhalb des Threads machen.

In dem Thread solltest Du nur das reine Einlesen der CSV durchführen.

Ich möchte da nochmal auf den Link den ich weiter oben gepostet habe hinweisen.
Das hilft einem bei der Aufgabe Tätigkeiten in einem extra Thread auszuführen enorm: Painless Threading | Android Developers


Hier mal nen Codebeispiel wie das in Live aussehen kann aus einer meiner Apps:


Code:
private class ForumListLoaderTask 
                        extends AsyncTask<Void, Void, List<ForumVO>> {
 	     
 	   protected List<ForumVO> doInBackground(Void... Void) {
 		   List<ForumVO> forums = null;
		try {
			forums = MoWal.getInstance().loadForumList();
		} catch (WTFException e) {
			Log.e(TAG, "Something went terribely wrong: ",e);
		} catch (SessionException e) {
			Log.e(TAG, "Session is no longer active", e);
		} 
 	   	        
 		   return forums;
           }

 	   protected void onPostExecute(List<ForumVO> forums) {
 		   dismissProgressDialog();
 		   if(null == forums || 0 == forums.size() ){
				showAlertDialog("Keine Foren gefunden!", 
				        "Leider konnte die Forenliste nicht bestimmt werden.");
			} else {
				displayForumList(forums);
			}
 	   }
  }

Paar Erläuterungen dazu:
Wenn man das ganze mit new ForumListLoaderTask().execute();
ausführt, wird die Methode doInBackground in einem extra Thread ausgeführt und beeinträchtigt somit nicht einen vorher erzeugten ProgressDialog.
Wenn der Thread fertig ist wird die Methode onPostExecute mit dem Rückabewert der
doInBackground Methode ausgeführt und zwar wieder im GUI-Thread (!)
In der doInBackground hol ich mir in dem Beispiel eine Liste die dann in der onPostExecute an eine Methode displayForumList übergeben wird. Da hab ich den Code drin, der die ListView bei mir füllt.

Hoffe das hilft Dir weiter.
 
  • Danke
Reaktionen: MBPower
@sorcerer
Super. Vielen Dank für die sehr gute Erklärung. :)

@swordi
Sollte ganz sicher keine Beleidigung sein. Android-Profis
wäre vielleicht der bessere Ausdruck gewesen. Musst nicht immer alles so auf die Waagschale legen. ;)
Nicht jeder ist ein Profi oder kann mit einer Doku immer sehr viel anfangen. Ein paar Worte helfen teilweise mehr als ein paar Links.
Dir aber auch Danke für die Infos.

@all
Vielen Dank an alle für die Hilfe.
 
Zuletzt bearbeitet:

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
484
jogimuc
J
A
Antworten
10
Aufrufe
1.902
swa00
swa00
Tiefkuehlpizza
Antworten
9
Aufrufe
929
Tiefkuehlpizza
Tiefkuehlpizza
Zurück
Oben Unten