2010-11-07 18 views
9

Desidero utilizzare una barra di avanzamento sul mio schermo invece di progressDialog.Progressbar insieme a asyncTask

Ho inserito un progressBar nel mio file di visualizzazione XML e voglio farlo visualizzare quando viene caricato e disabilitato quando non si carica.

Quindi stavo usando visibile, ma si verifica, quindi il resto dei dati scende.

Come utilizzare la barra di avanzamento in un asynctask? Come posso mostrarlo e nasconderlo?

+0

possibile duplicato del [Aggiornamento finestra di avanzamento in attività da AsyncTask] (http://stackoverflow.com/questions/4591878/updating- progress-dialog-in-activity-from-asynctask) –

risposta

4

Come per l'utilizzo Una barra di avanzamento da operazione asincrona è possibile utilizzare il PostPrgressUpdate() dal doInBackground(int Progress) e nel metodo OnProgressUpdate() aggiornare il ProgressBar conseguenza. Per quanto riguarda il mostrare e nascondere la barra di non ero in grado di capire la tua domanda (o il problema Si prega di revisione)

25

Ecco un esempio più esaustivo:

public class ScreenSplash extends Activity { 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screen_splash); 

     final ProgressBar progress = (ProgressBar)findViewById(R.id.progress); 
     final TextView textview = (TextView)findViewById(R.id.text); 

     new MyWorker(this, progress, textview).execute(); 
    } 
} 


final class MyWorker extends AsyncTask<Void, Integer, Void> { 
    private static final int titles[] = {R.string.splash_load_timezone, 
             R.string.splash_load_memory, 
             R.string.splash_load_genres, 
             R.string.splash_load_channels, 
             R.string.splash_load_content}; 
    private static final int progr[] = {30, 15, 20, 25, 20}; 

    private int index; 

    private final Activity parent; 
    private final ProgressBar progress; 
    private final TextView textview; 

    public MyWorker(final Activity parent, final ProgressBar progress, final TextView textview) { 
     this.parent = parent; 
     this.progress = progress; 
     this.textview = textview; 
    } 

    @Override 
    protected void onPreExecute() { 
     int max = 0; 
     for (final int p : progr) { 
      max += p; 
     } 
     progress.setMax(max); 
     index = 0; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected Void doInBackground(final Void... params) { 
     /* Load timezone. this is very slow - may take up to 3 seconds. */ 
      ... 
     publishProgress(); 

     /* Get more free memory. */ 
      ... 
     publishProgress(); 

     /* Load channels map. */ 
      ... 
     publishProgress(); 

     /* Load genre names. */ 
      ... 
     publishProgress(); 


     /* Preload the 1st screen's content. */ 
      ... 
     publishProgress(); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 
     textview.setText(titles[index]); 
     progress.incrementProgressBy(progr[index]); 
     ++index; 
    } 

    @Override 
    protected void onPostExecute(final Void result) { 
     parent.finish(); 
    } 
} 

Per shownig/nascondere la barra di avanzamento utilizzare progress.setVisibility(View.VISIBLE) e progress.setVisibility(View.GONE). C'è anche la costante View.INVISIBLE; la differenza rispetto a GONE è che la barra di avanzamento non è disegnata ma occupa ancora il suo spazio (utile per alcuni layout).

+3

Come molti esempi in quest'area, non tiene conto della possibilità che l'attività venga distrutta (e forse creata di nuovo) mentre l'attività è in esecuzione ... –

+0

Sì , è vero. C'è un buon post su questo problema: http://stackoverflow.com/questions/3357477/is-asynctask-really-massively-flawed-or-am-i-just-missing-something – JBM

+2

In effetti, si devono uccidere i loro bg attività in onDestroy. Le linee guida sulle attività dicono che dopo che l'attività è stata distrutta, non dovrebbe essere lasciato nulla in esecuzione in background (altrimenti si scarica la batteria del telefono). Quindi dovresti finire i tuoi AsyncTask obbligatori, anche se è solo l'utente a lanciare il telefono e ricominciare da capo su onCreate - stupido, sì, ma cosa possiamo fare se Google ha inserito il ciclo di vita di Activity in questo modo? – JBM

-1

in uso xml

<ProgressBar 
     android:id="@+id/progress_bar" 
     style="@android:style/Widget.ProgressBar.Small" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

poi nel Asyntask

ProgressBar mProgress=(ProgressBar) findViewById(R.id.progress_bar); 

@Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     mProgress.setVisibility(View.GONE); 
    }