2013-05-06 3 views
1

J'essaie d'avoir un ProgressDialog apparaissent lorsque le AsyncTask commence à OnPreExecute(), faire quelque chose dans doInBackground(), et fermer la ProgressDialog en onPostExecute(). Partout où je regarde cela est censé être facile et direct, mais je dois faire quelque chose de mal.Android - AsyncTask - OnPreExecute() court après doInBackground() est terminée

Chaque fois que je clique sur le Button dans mon application et mettre à jour le AsyncTask est exécuté l'application se bloque, attend un peu, puis le ProgressDialog apparaît instantanément et disparaît, avec le travail doInBackground() terminé. Je ne comprends pas pourquoi onPreExecute() est exécuté après doInBackground(), mais cela semble être exactement ce qui se passe ici. Voici le code:

public class UpdateStats extends AsyncTask<CatchAPI, Void, String[]> { 

    private ProgressDialog pdia; 
    private Context context; 
    private APIParser parser = new APIParser(); 

    public UpdateStats(Context contexts) { 
     context = contexts; 
    } 

    @Override 
    protected void onPreExecute() { 
     pdia = new ProgressDialog(context); 
     pdia.setMessage("Loading..."); 
     pdia.show(); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String[] doInBackground(CatchAPI... api) { 

     String apiOutput = api[0].returnAPI(); 

     return new String[] { 
       parser.getPoolName(apiOutput), 
       parser.getHashRate(apiOutput), 
       parser.getWorkers(apiOutput), 
       parser.getSharesThisRound(apiOutput) 
      }; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     pdia.dismiss(); 
     super.onPostExecute(result); 
    } 

} 

Et le onClickListener dans le MainActivity:

updateButton.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String[] text = null; 
     UpdateStats updater = new UpdateStats(context); 
     try { 
      text = updater.execute(api).get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     poolNameTV.setText(text[0]); 
     hashRateTV.setText(text[1]); 
     workersTV.setText(text[2]); 
     sharesThisRoundTV.setText(text[3]); 
    } 
}); 

Répondre

7

Dans ici:

text = updater.execute(api).get(); //<<< 

vous appelez AsyncTask.get() qui interface gel exécution du thread jusqu'à doInBackground exécution incomplète . exécuter AsyncTask comme:

updater.execute(api) 

et mettre à jour des éléments de l'interface utilisateur à l'intérieur onPostExecute qui a appelé sur l'interface utilisateur fil lors doInBackground exécution complète.

@Override 
protected void onPostExecute(String[] result) { 
    pdia.dismiss(); 
    // update UI here.. 
    poolNameTV.setText(result[0]); 
    hashRateTV.setText(result[1]); 
    workersTV.setText(result[2]); 
    sharesThisRoundTV.setText(result[3]); 

    super.onPostExecute(result); 

} 
+0

Parfait, c'était exactement cela. Merci! – DemonWav

+0

Il ne me laissait pas l'accepter au début, il va maintenant. Merci encore. – DemonWav

Questions connexes