Estoy probando algo nuevo en Android para lo cual necesito acceder al controlador del hilo de la interfaz de usuario.
Yo se lo siguiente:
- El hilo de la interfaz de usuario tiene su propio controlador y looper
- Cualquier mensaje se colocará en la cola de mensajes del hilo de la interfaz de usuario
- El looper recoge el evento y se lo pasa al controlador.
- El controlador maneja el mensaje y envía el evento específico a la interfaz de usuario
Quiero tener mi servicio que debe obtener el controlador de subprocesos de la interfaz de usuario y poner un mensaje en este controlador. Para que este mensaje se procese y se envíe a la interfaz de usuario. Aquí el servicio será un servicio normal que será iniciado por alguna aplicación.
Me gustaría saber si esto es posible. Si es así, sugiera algunos fragmentos de código para que pueda probarlo.
Saludos Girish
fuente
Cree un
Messenger
objeto adjunto a suHandler
y páseloMessenger
alService
(por ejemplo, en unIntent
extra parastartService()
). AService
continuación, puede enviar un mensajeMessage
aHandler
través deMessenger
. Aquí hay una aplicación de muestra que demuestra esto.fuente
Handler
, no puede acceder a él, AFAIK.ViewRoot
en el SDK de Android, AFAICT.Handler
/Messenger
, aunque reemplazaría todo eso con un bus de eventos (por ejemplo, EventBus de greenrobot).Por el momento, prefiero usar una biblioteca de bus de eventos como Otto para este tipo de problema. Simplemente suscriba los componentes deseados (actividad):
protected void onResume() { super.onResume(); bus.register(this); }
Luego proporcione un método de devolución de llamada:
public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. }
y luego, cuando su servicio ejecute una declaración como esta:
bus.post(new TimeLeftEvent(340));
Ese POJO se transferirá a su actividad anterior y a todos los demás componentes de suscripción. Simple y elegante.
fuente
Sugiero probar el siguiente código:
new Handler(Looper.getMainLooper()).post(() -> { //UI THREAD CODE HERE });
fuente
Puede obtener valores a través del receptor de transmisión ... de la siguiente manera, primero cree su propio IntentFilter como,
Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER");
Luego cree la clase interna BroadcastReceiver como,
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { /** Receives the broadcast that has been fired */ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } };
Ahora registre su receptor de transmisión en onResume () como,
registerReceiver(broadcastReceiver, intentFilter);
Y finalmente Anular el registro de BroadcastReceiver en onDestroy () como,
unregisterReceiver(broadcastReceiver);
Ahora la parte más importante ... Necesitas disparar la transmisión desde donde necesites enviar valores ..... así que haz lo,
Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i);
....salud :)
fuente
En
kotlin
esa es la forma que puede hacerloDigamos si desea mostrar el mensaje Toast del servicio
val handler = Handler(Looper.getMainLooper()) handler.post { Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show() }
fuente
Solución:
Handler
conLooper
desde Main Thread: responseHandler y overridehandleMessage
Runnable
tarea, llame a sendMessage en responseHandlersendMessage
invocación de resultado de handleMessage en responseHandler.Message
y procesarlo, actualizar la interfaz de usuarioCódigo de muestra:
/* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Override public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepare message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); }
fuente