1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

ProgressDialog CSV Import

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MBPower, 05.07.2010.

  1. MBPower, 05.07.2010 #1
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    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 Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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

    Beiträge:
    13
    Erhaltene Danke:
    4
    Registriert seit:
    07.06.2010
    Phone:
    Motorola Milestone
  5. MBPower, 05.07.2010 #5
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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

    Beiträge:
    13
    Erhaltene Danke:
    4
    Registriert seit:
    07.06.2010
    Phone:
    Motorola Milestone
    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 Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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

    Beiträge:
    13
    Erhaltene Danke:
    4
    Registriert seit:
    07.06.2010
    Phone:
    Motorola Milestone
    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 bedankt sich.
  10. MBPower, 08.07.2010 #10
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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

    Beiträge:
    13
    Erhaltene Danke:
    4
    Registriert seit:
    07.06.2010
    Phone:
    Motorola Milestone
    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 bedankt sich.
  13. MBPower, 08.07.2010 #13
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    @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

Diese Seite empfehlen