versiones pie oreo developer descargar android

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 a publishProgress .

  • 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"); } } }); }