Question

hey les gars, J'ai un problème avec dialogue de progression lors de l'ouverture d'une activité (appelée activité 2 dans l'exemple). L'activité 2 a beaucoup de code à exécuter dans cet événement OnCreate.

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showApps();
            }
        });
        myProgressDialog.dismiss();
    }
}.start(); 

Les showApps fonctionnent activité de lancement 2.

si j'exécute ce code sur mon bouton clic événement sur l'activité 1, je vois les progrès, mais elle ne bouge pas et je afeter un écran noir pendant 2 ou 3 secondes, le temps pour android pour montrer l'activité.

Si j'exécute ce code dans le OnCreate de Activity2 et si je remplace les showApps par le code sur OnCreate, Activité1 gèle 2 secondes, je ne vois pas la boîte de dialogue de progression, et le gel encore 2 secondes sur l'activité 2 avant de voir la résultat.

Une idée?

Était-ce utile?

La solution

J'ai eu le même problème et en utilisant un AsyncTask travaille pour moi.

Il existe 3 méthodes importantes pour passer outre à AsyncTask.

  1. doInBackground : c'est là la viande de votre arrière-plan le traitement se produira.
  2. OnPreExecute : montrer votre ProgressDialog ici (showDialog)
  3. onPostExecute : cacher votre ProgressDialog ici (removeDialog ou dismissDialog )

Si vous faites votre sous-classe AsyncTask comme une classe interne de votre activité, vous pouvez appeler les méthodes cadres showDialog, dismissDialog et removeDialog à partir de votre AsyncActivity.

Voici une implémentation d'AsyncTask:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}

Autres conseils

AFAIK vous ne pouvez pas précharger toute activité avec boîte de dialogue de progression affichée. testez-vous sur un périphérique réel ou dans l'émulateur?

J'ai vu des solutions de contournement qui a ouvert une activité avec un ViewFlipper ayant une animation de progression dans le centre, et dans l'autre vue, il a été chargé d'une activité, mais ce n'est pas quelque chose est recommandé et difficile à mettre en œuvre au travail que vous le souhaitez .

GeeXor

Je vous suggère d'éviter d'effectuer beaucoup d'opérations dans l'activité de beaucoup de 2 pour des opérations dans OnCreate est une raison de l'écran noir entre ces opérations activities.So EFFECTUER en mode asynchrone via AsyncTask ou dans un fil (ou les écrire dans onStart si elles sont inévitables).

L'autre suggestion est de commencer une autre ProgressDialog dans onCreate d'activité 2 qui se déroulera jusqu'à ce que toutes vos données sont chargées et utilisateur sait que quelque chose se passe en arrière-plan.

est ce que je ferais. créer un gestionnaire sur le thread d'interface utilisateur, démarrez le thread de traitement d'arrière-plan, puis montrer la ProgressDialog. lorsque le fil de fond a terminé le travail de l'obtenir il pour poster un runnable sur le thread d'interface via le gestionnaire de rejeter la boîte de dialogue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top