2011-04-05 6 views
0

J'ai une classe de dialogue de progression qui est une sous-classe de mon activité principale. Ce qui en soi fonctionne bien. J'ai une méthode appelée getNews qui envoie une requête http post et analyse le résultat, cela prend quelques secondes. Dans cette méthode, j'appelle UpdateFeedTask pour afficher le dialogue de progression de manière asynchrone, mais il ne semble pas le faire simultanément. La boîte de dialogue de progression semble s'ouvrir uniquement après la fin de la requête http. Au lieu d'afficher la boîte de dialogue de progression et d'envoyer la requête, la méthode getNews apparaît d'abord, puis brièvement la boîte de dialogue de progression après une fraction de seconde. Comment puis-je faire apparaître la boîte de dialogue avant d'aller chercher les données? Voici comment j'appelle les progrès de dialogueBoîte de dialogue de progression asynchrone Android retardée

public void getNews(){ 

      //show the progress dialog 
    new UpdateFeedTask().execute(); 


    //go fetch some data 
    WheruClient newsFeedLocation = new WheruClient(); 

    try { 

     newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when); 


    }catch (ClientProtocolException e) { 
     Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show(); 
    } catch (IOException e) { 
     Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show(); 
    }catch (JSONException e) { 
     Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

** EDIT nouvelle classe envoie async requête HTTP en arrière-plan et obtient de nouveau tableau de JSON, mais je reçois une erreur fatale qui lit

04-07 15:33 : 02.967: ERROR/AndroidRuntime (11004): Causé par: java.lang.RuntimeException: Impossible de créer le gestionnaire dans le thread qui n'a pas appelé Looper.prepare()

J'ai lu vos exemples et je pense que je manque quelque chose à propos de faire du travail en arrière-plan, des pensées?

public class UpdateFeedTask extends AsyncTask<Void, Void, JSONArray> { 


    @Override 
    protected void onPreExecute() { 
     //loading = ProgressDialog.show(NewsFeedActivity.this,"Please wait...", "Retrieving data ...", true); 
    } 

    @Override 
    protected void onProgressUpdate(Void... progress) { 

    } 


    @Override 
    protected void onPostExecute(JSONArray result) { 

     //loading.dismiss(); 
     updateFeed(result); 
    } 

    @Override 
    protected JSONArray doInBackground(Void... params) { 

     WheruClient newsFeedLocation = new WheruClient(); 

     try { 
      newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return newsFeedArray; 
    } 

} 

Répondre

1

La tâche gourmande en temps doit être appelée dans doInBackground. Je ne vois rien dans votre méthode doInBackground. Attention, ne touchez pas l'interface utilisateur dans doInBackground. J'ai un exemple de code here.

+0

Merci, j'ai changé la structure pour faire le travail dans la méthode doInBackground. Il semble maintenant ouvrir la boîte de dialogue de progression, aller chercher le tableau json mais se bloque rapidement après. Pas tout à fait sûr quel est le problème. – Brian

+0

@Brian Perin Peut-être que l'appel dans doInBackground lance une exception dans le thread. Je voudrais envelopper l'appel dans doInBackground dans un try catch e et Log.d (TAG, "msg", e) pour voir ce qui se bloque l'application. – JAL

Questions connexes