2010-11-23 18 views
7

hey guys, Ho un problema con la finestra di dialogo dell'avanzamento sull'apertura di un'attività (chiamata attività 2 nell'esempio). L'attività 2 ha un sacco di codice da eseguire in questo evento OnCreate.Finestra di dialogo di avanzamento all'apertura dell'attività

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(); 

La funzione di lancio showApps attività 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 in OnCreate di Activity2 e se sostituisco lo showApps con il codice su OnCreate, Activity1 si blocca 2 secondi, non vedo la finestra di dialogo di avanzamento e congelamento di nuovo 2 secondi sull'attività 2 prima di vedere il risultato.

Un'idea?

+0

Si crea un thread che verrà eseguito il codice che viene eseguito in thread UI ?! Questo è un trucco/soluzione che ho bisogno di sapere o è solo sbagliato? – WarrenFaith

+0

Ehi, @WarrenFaith, potresti darmi un calcio e accettare la mia risposta più votata a questa domanda? –

+0

@Darren non è la mia domanda :) – WarrenFaith

risposta

10

Ho avuto lo stesso problema e l'utilizzo di un AsyncTask funziona per me.

Esistono 3 metodi importanti per l'override in AsyncTask.

  1. doInBackground: è qui che si verifica la carne della vostra elaborazione in background .
  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 puoi chiamare i metodi framework showDialog, dismissDialog e removeDialog da 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); 
    } 
} 
2

AFAIK non è possibile eseguire il precaricamento di alcuna attività con la finestra di dialogo di avanzamento visualizzata. Stai provando su un dispositivo reale o in emulatore?

Ho visto soluzioni alternative che hanno aperto un'attività con un ViewFlipper con un'animazione di avanzamento nel centro e nella successiva vista, è stata caricata un'attività, ma non è consigliabile e difficile da implementare per funzionare come desiderio.

+0

Sì, ho provato entrambi con lo stesso risultato, più veloce sull'emulatore perché lancio un'attività con tutte le app installate e poche sull'emulatore. Hum, 2 animazioni non è il comportement che desidero:/ – Pachanka

3

GeeXor

io vi suggerisco di evitare di eseguire un sacco di operazioni in attività 2 del sacco OnCreate.Writing 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 scriverli in onStart se sono inevitabili).

L'altro suggerimento è di avviare un altro progressDialog in attività 2 suCreate che verrà eseguito fino a quando tutti i dati sono stati caricati. & l'utente saprà che qualcosa sta accadendo in background.

+0

ok, guarderò stasera e aprirò la risposta, grazie – Pachanka

0

questo è quello che vorrei fare. creare un gestore sul thread dell'interfaccia utente, avviare il thread di elaborazione in background e quindi mostrare il file di sviluppo. quando il thread in background ha finito è lavoro farlo pubblicare un runnable sul thread ui tramite il gestore per chiudere la finestra di dialogo.

+0

hum ho visto molte applicazioni con una piccola rotellina come nella finestra di dialogo di avanzamento direttamente nell'attività (in alto o in basso nell'attività). Cos'è quello ? – Pachanka

+0

Dai un'occhiata a "Activity.setProgress'. Ci sono un certo numero di opzioni per impostare la piccola ruota che gira sulla barra del titolo delle attività. – techiServices

+0

ok, ho trovato una soluzione qui: http://stackoverflow.com/questions/3893626/how-to-use-asynctask-to-show-a-progressdialog-while-doing-background-work-in-andr – Pachanka

Problemi correlati