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;
}
}
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
@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