pie - Android runOnUiThread explicación
android pie (3)
En lugar de crear un hilo y usar runOnUIThread
, este es un trabajo perfecto para ASyncTask :
En
onPreExecute
, crea y muestra el cuadro de diálogo.en
doInBackground
prepare los datos, pero no toque la IU - almacene cada dato preparado en un campo, luego llame apublishProgress
.En
onProgressUpdate
lea el campo de referencia y realice el cambio / adición apropiado a la IU.En
onPostExecute
el diálogo.
Si tiene otras razones para querer un hilo, o está agregando lógica de toque de UI a un hilo existente, realice una técnica similar a la que describo, para ejecutar el hilo de UI solo por breves períodos, usando runOnUIThread
para cada paso de UI. En este caso, almacenará cada dato en una variable final
local (o en un campo de su clase), y luego lo usará dentro de un bloque runOnUIThread
.
Intento mostrar un cuadro de diálogo de progreso durante el método onCreate () de una de mis actividades, hacer el trabajo para rellenar la pantalla realizada en un hilo y luego cerrar el cuadro de diálogo de progreso.
Aquí está mi onCreateMethod ()
dialog = new ProgressDialog(HeadlineBoard.this);
dialog.setMessage("Populating Headlines.....");
dialog.show();
populateTable();
El método populateTable contiene mi hilo y el código para descartar el diálogo, pero por alguna razón. La actividad aparece en blanco durante aproximadamente 10 segundos (haciendo el trabajo populateTable ()), y luego veo la pantalla. Nunca veo el diálogo mostrado, ninguna idea?
Aquí está el código populateTable ():
//Adds a row to the table for each headline passed in
private void populateTable() {
new Thread() {
@Override
public void run() {
//If there are stories, add them to the table
for (Parcelable currentHeadline : allHeadlines) {
addHeadlineToTable(currentHeadline);
}
try {
// code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
});
} catch (final Exception ex) {
Log.i("---","Exception in thread");
}
}
}.start();
}
Esto debería funcionar para ti
public class MyActivity extends Activity {
protected ProgressDialog mProgressDialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
populateTable();
}
private void populateTable() {
mProgressDialog = ProgressDialog.show(this, "Please wait","Long operation starts...", true);
new Thread() {
@Override
public void run() {
doLongOperation();
try {
// code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressDialog.dismiss();
}
});
} catch (final Exception ex) {
Log.i("---","Exception in thread");
}
}
}.start();
}
/** fake operation for testing purpose */
protected void doLongOperation() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
}
}
Si ya tiene los datos "para (Línea actualizable parcelable: todasLíneas)," entonces, ¿por qué está haciendo eso en un hilo separado?
Debería sondear los datos en un subproceso separado, y cuando termine de recopilarlos, llame al método populateTables en el subproceso de la interfaz de usuario:
private void populateTable() {
runOnUiThread(new Runnable(){
public void run() {
//If there are stories, add them to the table
for (Parcelable currentHeadline : allHeadlines) {
addHeadlineToTable(currentHeadline);
}
try {
dialog.dismiss();
} catch (final Exception ex) {
Log.i("---","Exception in thread");
}
}
});
}