1. Gewinne jetzt ein UMiDIGI C Note - alle Informationen findest du hier!!
  1. MBPower, 05.07.2010 #1
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    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: 05.07.2010
  2. MichaelS, 05.07.2010 #2
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    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 ;)
     
  3. MBPower, 05.07.2010 #3
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    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: 05.07.2010
  4. sorcerer, 05.07.2010 #4
    sorcerer

    sorcerer Neuer Benutzer

  5. MBPower, 05.07.2010 #5
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    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.
     
  6. sorcerer, 06.07.2010 #6
    sorcerer

    sorcerer Neuer Benutzer

    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.
     
  7. MBPower, 06.07.2010 #7
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    Mit dem folgenden Code im catch-Block stürzt das App ab.
    Code:
    AlertDialog (e.getMessage()); 
    
    Fehlermeldung:
    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.
     
  8. DieGoldeneMitte, 06.07.2010 #8
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Du solltest besser mit Log.d(lbl,msg) (oder in eine Datei auf der SD Karte) loggen, insbesondere, wenn Du UI-Thread Probleme debuggst.
     
  9. sorcerer, 06.07.2010 #9
    sorcerer

    sorcerer Neuer Benutzer

    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);
     
    MBPower gefällt das.
  10. MBPower, 08.07.2010 #10
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    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:
     
    Zuletzt bearbeitet: 08.07.2010
  11. swordi, 08.07.2010 #11
    swordi

    swordi Gewerbliches Mitglied

    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
     
  12. sorcerer, 08.07.2010 #12
    sorcerer

    sorcerer Neuer Benutzer

    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.
     
    MBPower gefällt das.
  13. MBPower, 08.07.2010 #13
    MBPower

    MBPower Threadstarter Erfahrener Benutzer

    @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: 08.07.2010
Die Seite wird geladen...
Ähnliche Themen Forum Datum
AsyncTask ProgressDialog ändern Android App Entwicklung 21.02.2017
ProgressDialog und SnackBar in MainActivity Android App Entwicklung 16.02.2017
Import Fehler beim Navigation Drawer Android App Entwicklung 01.12.2016
Import externer Bibliothek (UpscaleDB) Android App Entwicklung 06.09.2016
Du betrachtest das Thema "ProgressDialog CSV Import" im Forum "Android App Entwicklung",