Finestra di avanzamento sull'attività aperto
-
27-09-2019 - |
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?
Soluzione
Ho avuto lo stesso problema e si utilizza un AsyncTask sta lavorando per me.
Ci sono 3 metodi importanti per ignorare in AsyncTask.
- doInBackground : è qui che la carne del tuo background si verificherà l'elaborazione.
- OnPreExecute : mostrare il vostro ProgressDialog qui (showDialog)
- 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.