Domanda

Hey ragazzi, Ho un problema con la finestra di avanzamento per l'apertura di un'attività (chiamato l'attività 2 nell'esempio). L'attività 2 ha un sacco di codice da eseguire in questo evento 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(); 

I showApps funzionano le attività di lancio 2.

Se eseguo questo codice sul mio evento click del pulsante sull'attività 1, vedo il progresso, ma lei non si muove e afeter ho una schermata nera durante 2 o 3 secondi il tempo per Android per mostrare l'attività.

Se eseguo questo codice nel OnCreate di Activity2 e se si sostituisce la showApps dal codice sulla OnCreate, Activity1 congelare 2 secondi, non vedo la finestra di avanzamento, e congelare ancora 2 secondi sulle attività del 2 prima di vedere la risultato.

Un'idea?

È stato utile?

Soluzione

Ho avuto lo stesso problema e si utilizza un AsyncTask sta lavorando per me.

Ci sono 3 metodi importanti per ignorare in AsyncTask.

  1. doInBackground : è qui che la carne del tuo background si verificherà l'elaborazione.
  2. OnPreExecute : mostrare il vostro ProgressDialog qui (showDialog)
  3. OnPostExecute : nascondere il ProgressDialog qui (removeDialog o dismissDialog )

Se fate la vostra sottoclasse AsyncTask come una classe interna della vostra attività, quindi è possibile chiamare i metodi quadro showDialog, dismissDialog, e removeDialog dall'interno AsyncActivity.

Ecco un esempio di implementazione 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);
  }
}

Altri suggerimenti

Per quanto ne so non è possibile precaricare qualsiasi attività con finestra di avanzamento visualizzata. Stai provando su un dispositivo reale o in emulatore?

ho visto soluzioni alternative che hanno aperto un'attività con un ViewFlipper avere di un'animazione di avanzamento nel centro, e nella prossima View, è stato caricato un'attività, ma non è qualcosa che è raccomandato e difficile da attuare per il lavoro come si desidera .

GeeXor

I suggeriresti per evitare di eseguire un sacco di operazioni in attività 2 di OnCreate.Writing un sacco di operazioni in OnCreate è una ragione per la schermata nera tra activities.So eseguire tali operazioni in modo asincrono utilizzando AsyncTask o in un thread (o scrivere in onStart se sono inevitabili).

L'altro suggerimento è quello di iniziare un altro progressDialog nell'attività 2 di onCreate che si protrarrà fino a quando tutti i dati viene caricato e utente saprà che qualcosa sta accadendo in background.

Questo è quello che vorrei fare. creare un gestore sul thread dell'interfaccia utente, avviare il thread di elaborazione in background e poi mostrare il progressdialog. quando il thread in background ha finito il proprio lavoro ottenerlo per pubblicare un eseguibile sul thread dell'interfaccia utente tramite il gestore per chiudere la finestra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top