Я пробую что-то новое на Android, для чего мне нужно получить доступ к обработчику потока пользовательского интерфейса.
Знаю следующее:
- У потока пользовательского интерфейса есть собственный обработчик и цикл.
- Любое сообщение будет помещено в очередь сообщений потока пользовательского интерфейса.
- Лупер забирает событие и передает его обработчику.
- Обработчик обрабатывает сообщение и отправляет конкретное событие пользовательскому интерфейсу.
Я хочу иметь свою службу, которая должна получать обработчик потока пользовательского интерфейса и помещать сообщение в этот обработчик. Так что это сообщение будет обработано и передано в пользовательский интерфейс. Здесь сервис будет обычным сервисом, который будет запускаться каким-то приложением.
Я хотел бы знать, возможно ли это. Если да, то предложите несколько фрагментов кода, чтобы я мог попробовать.
С уважением, Гириш
источник
Создайте
Messenger
объект, прикрепленный к вашему,Handler
и передайтеMessenger
егоService
(например, вIntent
дополнении forstartService()
).Service
Может затем послатьMessage
кHandler
ПОСРЕДСТВОМMessenger
. Вот пример приложения, демонстрирующий это.источник
Handler
, вы не можете получить к нему доступ, AFAIK.ViewRoot
в Android SDK, AFAICT.Handler
/Messenger
, хотя я бы заменил все это шиной событий (например, EventBus greenrobot).На данный момент я предпочитаю использовать библиотеку шины событий, такую как Otto, для такого рода проблем. Просто подпишитесь на желаемые компоненты (активность):
protected void onResume() { super.onResume(); bus.register(this); }
Затем укажите метод обратного вызова:
public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. }
а затем, когда ваша служба выполнит такую инструкцию:
bus.post(new TimeLeftEvent(340));
Этот POJO будет передан в указанное выше действие и во все другие компоненты подписки. Просто и элегантно.
источник
Предлагаю попробовать следующий код:
new Handler(Looper.getMainLooper()).post(() -> { //UI THREAD CODE HERE });
источник
Вы можете получить значения через широковещательный приемник ... следующим образом: сначала создайте свой собственный IntentFilter как,
Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER");
Затем создайте внутренний класс BroadcastReceiver как,
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"); } } };
Теперь зарегистрируйте свой широковещательный приемник в onResume () как,
registerReceiver(broadcastReceiver, intentFilter);
И, наконец, отмените регистрацию BroadcastReceiver в onDestroy () как,
unregisterReceiver(broadcastReceiver);
Теперь самая важная часть ... Вам нужно запустить трансляцию из любого места, где вам нужно отправить значения ... так что сделайте как,
Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i);
.... ура :)
источник
В
kotlin
то как вы можете это сделатьСкажем, если вы хотите показать тост-сообщение от службы
val handler = Handler(Looper.getMainLooper()) handler.post { Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show() }
источник
Решение:
Handler
помощьюLooper
Main Thread: responseHandler и переопределитеhandleMessage
методRunnable
задачи вызовите sendMessage на responseHandlersendMessage
результат вызова handleMessage в responseHandler.Message
и обработать, обновить UIОбразец кода:
/* 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); }
источник