Inicio de un runnable en el hilo de fondo
Tengo, a mi conocimiento, implementado un runnable que se crea en un nuevo hilo. Sin embargo, el subproceso no parece estar ejecutándose en segundo plano y las acciones tomadas dentro de ejecutables están bloqueando la interfaz de usuario con acciones pesadas.
Vea abajo:
- ¿Es seguro usar Java Threads de la misma manera que las aplicaciones de escritorio?
- ¿Cuál es la mejor práctica para hacer llamadas http en android
- Android wait asynctask para terminar
- ¿Es Thread.sleep (x) lo suficientemente preciso como para usarlo como reloj en Android?
- Cómo crear un hilo en Android NDK?
custListLoadThread = new Thread(loadRunnable); custListLoadThread.run(); private Runnable loadRunnable = new Runnable() { @Override public void run() { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); Gen.popup("TEST"); // Creates a toast pop-up. // This is to know if this runnable is running on UI thread or not! try { customers = Db.BasicArrays.getCustomers(CustomApp.Session.businessCode, empId); runOnUiThread(new Runnable() { @Override public void run() { populate(); setCustListVisible(true); loading = false; } }); } catch (final Exception ex) { runOnUiThread(new Runnable() { @Override public void run() { Gen.popup(ex.getMessage()); } }); } } };
Sin embargo, este código no se ejecuta en segundo plano, todavía parece ejecutarse en el subproceso de interfaz de usuario. He colocado la línea Gen.popup("TEST");
Para asegurarse de que esto (llamar a un toast
pop-up en un hilo no UI debe causar un error).
Cualquier idea de por qué este runnable no se está ejecutando en segundo plano?
- ¿Cómo termino HandlerThreads?
- Android equivalente de iOS GCD dispatch_group API
- Cómo y reiniciar el hilo de nuevo en la actividad creada
- ¿Cómo evitar la espera en el hilo principal cuando se añaden los encabezados a las solicitudes de retrofit?
- Enviar tareas a un grupo de subprocesos proporciona RejectedExecutionException
- ¿Cómo ejecutar la solicitud web en su propio hilo?
- Progressdialog lento para mostrar en Android
- ¿Un Runnable puede devolver un valor?
custListLoadThread = new Thread(loadRunnable); custListLoadThread.start();
Necesita iniciar el subproceso, no llamar al método run () en el subproceso actual.
Si desea ejecutar código en un subproceso de fondo que no hace algo con la interfaz de usuario:
Runnable runnable = new Runnable() { @Override public void run() { //your action } }; AsyncTask.execute(runnable);
Por supuesto, como se escribe antes de que también puede crear un nuevo hilo (que es independiente de la interfaz de usuario de hilo):
new Thread(runnable).start();
En tu ejemplo quieres actualizar los elementos de la interfaz de usuario, así que mejor utilizar un AsyncTask
(debe ser llamado desde el subproceso de interfaz de usuario):
new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { // your async action return null; } @Override protected void onPostExecute(Void aVoid) { // update the UI (this is executed on UI thread) super.onPostExecute(aVoid); } }.execute();
- No hay sonido de notificación personalizado
- Cómo obtener net :: ERR_UNKNOWN_URL_SCHEME mientras llama al número de teléfono de la página HTML en Android