Android, creando un hilo sencillo que actualizará mi contador de segundos
Básicamente, estoy tratando de ejecutar un contador segundos y un contador de niveles. Por cada 10 segundos quiero nivelar ++.
Pero eso no está implementado hasta ahora, hasta ahora sólo estoy tratando de obtener los segundos para mostrar, pero estoy recibiendo excepciones de tiempo de ejecución y un accidente.
Googling Veo que es porque estoy tratando de actualizar la interfaz de usuario de mi hilo y eso no está permitido. Así que supongo que voy a necesitar asyncTask, pero no tengo ni idea de cómo hacerlo con mi pequeño programa simple. Por favor ayude o déme algunas alternativas …
package com.ryan1; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class main extends Activity { int level = 1; int seconds_running=0; TextView the_seconds; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); the_seconds = (TextView) findViewById(R.id.textview_seconds); Thread thread1 = new Thread(){ public void run(){ try { sleep(1000); Log.d("RYAN", " RYAN "); updated_secs(); } catch (Exception e) { e.printStackTrace(); Log.d("RYAN", " "+e); } } }; thread1.start(); } public void updated_secs(){ seconds_running++; the_seconds.setText(" "+seconds_running); } }
- Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
- DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
- ¿Por qué sólo el subproceso de interfaz de usuario en Android puede actualizar la interfaz de usuario?
- Cómo saber si este hilo es un hilo de interfaz de usuario
- Android ViewPager cambia automáticamente la página
- Animación de una vista mientras que ListView no está funcionando
- ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
- ¿Por qué se utiliza un único modelo de subproceso para actualizar la interfaz de usuario como subproceso principal?
- No error "Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas" cuando la vista se actualiza sin demora
- No se muestra la vista de Android después del método addView
- IU de Android: ¿cuándo puedo modificar directamente una vista?
- ¿Es posible usar AsyncTask en una clase de servicio?
- Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
Crear un controlador en el hilo de interfaz de usuario, a continuación, en el subproceso de trabajo enviar un mensaje al controlador (Handler.sendMessage (…)).
El mensaje se procesará en el hilo de la interfaz de usuario, por lo que puede actualizar el widget de texto correctamente. Me gusta esto:
private Handler myUIHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == some_id_you_created) { //Update UI here... } } }; Then in your thread, to send a message to the handler you do this: Message theMessage = myHandler.obtainMessage(some_id_you_created); myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler.
Para este tipo de cosas, es un desperdicio usar otro hilo; Es sólo un desperdicio y lo hace así que tienes que dael con multithreading problemas. En su lugar, sólo utilice Handler.sendDelayedMessage ():
static final int MSG_DO_IT = 1; static final long TIME_BETWEEN_MESSAGES = 10 * 1000; // 10 seconds Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_DO_IT: { // Update your UI here... Message newMsg = obtainMessage(MSG_DO_IT); sendMessageDelayed(newMsg, TIME_BETWEEN_MESSAGES); } break; } } } @Override void onResume() { super.onResume(); // Start the timer, executing first event immediately. Message newMsg = mHandler.obtainMessage(MSG_DO_IT); mHandler.sendMessage(newMsg); } @Override void onPause() { super.onPause(); // Stop the timer. mHandler.removeMessages(MSG_DO_IT); }
Tenga en cuenta que esta implementación tendrá algún tipo de deriva: el tiempo real entre los mensajes es TIME_BETWEEN_MESSAGES + (tiempo para enviar el mensaje). Si necesita algo que no se desvíe, puede hacer el tiempo usted mismo usando Hander.sendMessageAtTime () e incrementar la nueva hora con un valor constante cada vez, comenzando con una hora inicial que obtiene con SystemClock.uptimeMillis () en onResume ().
Hay un gran ejemplo de un temporizador construido utilizando AsyncTask y un controlador con el método postDelayed.
Está correcto que la actualización de la interfaz de usuario de un fondo es un no-no.
- Llamar a varias AsyncTask a la vez que no funcionan en Android
- Eliminar sombras debajo de la barra de herramientas appcompat