web-dev-qa-db-fra.com

Afficher une barre de progression lors du chargement d'une activité

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:

  • Récupérer les données sérialisables (pas toutes mais une partie) dans un 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();
    }
}
20
Adam

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.

16
Damp

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.

3
Mike

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.

2
Will Tate