J'ai un ListActivity
qui lance un autre Activity
basé sur la sélection de la liste. Ce second Activity
doit charger un bon nombre de données à partir d'Internet et en tant que tel, il y a un délai notable entre le moment où l'utilisateur clique sur un élément et le moment où le Activity
s'affiche.
C'est un problème car je n'ai actuellement aucun moyen d'indiquer à l'utilisateur que son clic est en cours de traitement (même un simple changement de couleur de l'élément de liste sélectionné serait suffisant mais je ne trouve pas un bon moyen de le faire). Idéalement, je serais en mesure d'afficher un ProgressDialog
indéterminé pendant le chargement du second Activity
.
J'ai essayé quelques approches différentes pour cela, mais rien ne semble fonctionner comme souhaité.
J'ai essayé ce qui suit:
AsyncTask
dans le premier Activity
et les passer en supplément à la seconde. Cela n'a pas vraiment bien fonctionné car un ProgressDialog
que j'ai créé dans onPreExecute()
ne s'est pas affiché immédiatement (il semble retardé par le traitement effectué dans doInBackground()
pour une raison quelconque. )Voici le code pour cela:
AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() {
Dialog progress;
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(SearchActivity.this,
"Loading data", "Please wait...");
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
DatasetReader reader = new DatasetReader();
reader.setFundID(params[0]);
reader.addDatsets(FundProfile.datasets);
reader.populate();
return reader.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progress.dismiss();
}
};
read.execute(selectedItem.getUniqueID());
try {
action = new Intent(SearchActivity.this, FundProfile.class);
action.putExtra("data", read.get());
} catch(Exception ex) {
ex.printStackTrace();
}
Dans la méthode onCreate()
de la deuxième activité (cela ne fonctionne pas du tout):
requestWindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarVisibility (true);
Voici la méthode onCreate()
pour la deuxième approche:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitleColor(Color.WHITE);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarVisibility(true);
try {
setContentView(R.layout.fund_profile);
// init some data
setProgressBarVisibility(false);
} catch(Exception ex) {
FundProfile.this.finish();
}
}
Si vous avez de longues opérations, vous ne devriez en aucun cas les faire dans onCreate car cela gèlerait l'interface utilisateur (que l'activité soit affichée ou non). L'interface utilisateur définie par onCreate n'apparaîtra pas et l'interface utilisateur ne répondra qu'après la fin de l'appel onCreate.
Il semble que vous puissiez démarrer votre deuxième activité et afficher une barre de progression (ou requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
), puis démarrer une ASyncTask qui sera responsable de la mise à jour de votre interface utilisateur une fois les données récupérées.
Déplacez la création de l'intention - et vraiment tout ce que vous devez faire après la fin de la tâche AsyncTask - dans onPostExecute:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progress.dismiss();
Intent action = new Intent(SearchActivity.this, FundProfile.class);
action.putExtra("data", result);
// ... do more here
}
Le problème est que blocs AsyncTask.get () jusqu'à ce que la tâche soit terminée. Ainsi, dans le code ci-dessus, le thread d'interface utilisateur est bloqué et le ProgressDialog n'a jamais la possibilité d'apparaître jusqu'à la fin de la tâche.
Adam,
Il semble que vous recherchiez la barre de progression indéterminée: http://developer.Android.com/resources/samples/ApiDemos/src/com/example/Android/apis/view/ProgressBar2.html
Vous pouvez l'afficher pendant que vous chargez votre deuxième Activity
puis définissez la visibilité sur false une fois que le second Activity
a chargé ses données.