2010-11-07 14 views
9

Quiero usar una barra de progreso en mi pantalla en vez de progressDialog.Progressbar togther with asyncTask

He insertado una barra de progreso en mi archivo XML-view, y quiero hacer que se muestre cuando se carga y deshabilitar cuando no se carga.

Así que estaba usando visible, pero tiene lugar, por lo que el resto de los datos se reduce.

¿Cómo debo usar la barra de progreso en una asynctask? ¿Cómo puedo mostrarlo y esconderlo?

+0

posible duplicado de [Actualización de diálogo de progreso en la Actividad de AsyncTask] (http://stackoverflow.com/questions/4591878/updating- progress-dialog-in-activity-from-asynctask) –

Respuesta

4

cuanto al uso de una barra de progreso de la tarea asíncrona puede utilizar el PostPrgressUpdate() de su doInBackground(int Progress) y en el método OnProgressUpdate() actualizar el ProgressBar en consecuencia. En cuanto al mostrar y ocultar de la barra no era capaz de entender su pregunta (o el problema Por favor revisar)

25

Aquí es un ejemplo más exhaustiva:

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

Para shownig/ocultar la barra de progreso use progress.setVisibility(View.VISIBLE) y progress.setVisibility(View.GONE). También hay View.INVISIBLE constante; su diferencia de GONE es que su barra de progreso no se dibuja pero aún ocupa su espacio (útil para algunos diseños).

+3

Como con muchos ejemplos en esta área, no tiene en cuenta la posibilidad de que la actividad se destruya (y tal vez se cree de nuevo) mientras la tarea se está ejecutando ... –

+0

Sí , es verdad. Hay una buena publicación sobre este problema: http://stackoverflow.com/questions/3357477/is-asynctask-really-massively-flawed-or-am-i-just-missing-something – JBM

+2

De hecho, uno debe matar a su tareas de bg en onDestroy. Las pautas de actividad dicen que después de que la actividad se destruya, no debería quedar nada en segundo plano (de lo contrario, se agota la batería del teléfono). Por lo tanto, deberías terminar tus AsyncTasks de manera obligatoria, incluso si el usuario simplemente voltea el teléfono y comienzas de nuevo en Crear: estúpido, sí, pero ¿qué podemos hacer si Google ha puesto el ciclo de vida de la Actividad de esta manera? – JBM

-1

en uso xml

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

entonces en Asyntask

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

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