2014-08-28 4 views
0

J'apprends le développement d'applications mobiles Quand j'ai implémenté Async Task, ça ne fonctionnait pas du tout quand j'ai ajouté onPostExecute et onPreExecute en dehors de doInBackground ça fonctionnait mais ça s'arrêtait de fonctionner après un tandis que. En fait, j'essaie de sauvegarder les données de EditText en cliquant sur le bouton de sauvegarde et d'essayer de le récupérer en utilisant le bouton Charger et de l'afficher en mode Texte. Maintenant, j'ai également ajouté une barre de progression à cela. Il lance une exception de pointeur nul.Async Tâche fonctionnant parfois et ne fonctionnant pas la plupart du temps

public class loadSomeStuff extends AsyncTask<String, Integer, String>{ 
     ProgressDialog dialog; 

    protected void onPreExecute(String f) { 
     dialog = new ProgressDialog(FileOperations.this); 
     dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     dialog.setMax(100); 
     dialog.show(); 
     f="whatever"; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     FileInputStream fis=null; 
     String dataResult=null; 

     for(int i=0;i<20;i++){ 
      publishProgress(5); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
     dialog.dismiss(); 
     try { 
      fis = openFileInput(FILENAME); 
      byte[] dataArray = new byte[fis.available()]; 
      while(fis.read(dataArray) != -1){ 
       dataResult= new String(dataArray); 

      } 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally{ 
      try { 
       fis.close(); 
       return dataResult; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return "no data to handle"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     dialog.incrementProgressBy(values[0]); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     viewResults.setText(result); 
    } 

} 
} 

Ceci est mon logcat:

08-28 00:34:42.718: W/EGL_emulation(1430): eglSurfaceAttrib not implemented 
08-28 00:34:49.528: D/AndroidRuntime(1430): Shutting down VM 
08-28 00:34:49.528: W/dalvikvm(1430): threadid=1: thread exiting with uncaught exception (group=0xada39ba8) 
08-28 00:34:49.538: E/AndroidRuntime(1430): FATAL EXCEPTION: main 
08-28 00:34:49.538: E/AndroidRuntime(1430): Process: com.tarragon.tmessenger, PID: 1430 
08-28 00:34:49.538: E/AndroidRuntime(1430): java.lang.NullPointerException 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at com.tarragon.tmessenger.FileOperations$loadSomeStuff.onProgressUpdate(FileOperations.java:154) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at com.tarragon.tmessenger.FileOperations$loadSomeStuff.onProgressUpdate(FileOperations.java:1) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:648) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at android.os.Handler.dispatchMessage(Handler.java:102) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at android.os.Looper.loop(Looper.java:136) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
08-28 00:34:49.538: E/AndroidRuntime(1430):  at dalvik.system.NativeStart.main(Native Method) 
08-28 00:34:51.598: W/dalvikvm(1430): threadid=12: thread exiting with uncaught exception (group=0xada39ba8) 
08-28 00:34:51.598: I/Process(1430): Sending signal. PID: 1430 SIG: 9 
+0

Assurez-vous obtenez des valeurs correctes dans votre méthode 'onProgressUpdate'. – GrIsHu

+0

Assurez-vous simplement que votre FILENAME n'est pas nul. – Piyush

+0

'Thread.sleep (100);' cela bloquera 'Thread principal' !!! –

Répondre

4

Votre onPreExecute() a mauvaise signature. Il ne devrait pas prendre d'arguments. En tant que tel, il ne remplace pas une méthode et n'est pas invoqué, et par conséquent votre dialog reste null.

Notez également l'annotation @Override manquante - Les IDE avec la configuration par défaut l'ajoutent automatiquement aux méthodes qui remplacent une méthode et la vôtre ne l'a pas.

Supprime l'argument String f de la méthode.

+0

Cool !! Merci beaucoup. Pensez-vous que vous pourriez m'aider avec cette question: http://stackoverflow.com/questions/25549679/how-can-i-split-a-long-single-sqliteopenhelper-into-serveral-classes-one-for-e – eddy

2

enlèverait juste la dialog.dismiss(); de votre méthode doInBackground et l'écrire dans la méthode onPostExecute. Vous obtenez une erreur Nullpointer parce que vous avez déjà rejeté une boîte de dialogue et en même temps vous essayez de mettre à jour sa progression. C'est pourquoi il n'est pas en mesure d'obtenir le dialogue.

J'ai enlevé la méthode dialog.dismiss(); de doInBackground et conservés dans onPostExecute();

Essayez comme ci-dessous:

@Override 
protected String doInBackground(String... params) { 
    // TODO Auto-generated method stub 
    FileInputStream fis=null; 
    String dataResult=null; 

    for(int i=0;i<20;i++){ 
     publishProgress(5); 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    ........................................... 

    return "no data to handle"; 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    dialog.incrementProgressBy(values[0]); 
} 

@Override 
protected void onPostExecute(String result) { 
     dialog.dismiss(); 
    viewResults.setText(result); 
} 

} 
0

écriture méthode post comme ceci:

@Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
    } 
2

Votre méthode OnPreExecute est erroné comme comme

ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     dialog = new ProgressDialog(FileOperations.this); 
     dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     dialog.setMax(100); 
     dialog.show(); 

    } 

et retirer le dialog.dismiss() de doInBackground et l'ajouter à la méthode onPostExecute il comme ça ..

@Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     viewResults.setText(result); 

     if (dialog.isShowing()) 
      dialog.dismiss(); 
    } 
Questions connexes