Próbuję czegoś nowego w systemie Android, dla którego muszę uzyskać dostęp do programu obsługi wątku interfejsu użytkownika.
Wiem co następuje:
- Wątek interfejsu użytkownika ma własny program obsługi i pętlę
- Każda wiadomość zostanie umieszczona w kolejce komunikatów wątku interfejsu użytkownika
- Looper odbiera zdarzenie i przekazuje je do procedury obsługi
- Program obsługi obsługuje komunikat i wysyła określone zdarzenie do interfejsu użytkownika
Chcę mieć moją usługę, która musi pobrać program obsługi wątków interfejsu użytkownika i umieścić komunikat w tym programie obsługi. Aby ta wiadomość została przetworzona i wysłana do interfejsu użytkownika. W tym przypadku usługa będzie normalną usługą uruchamianą przez jakąś aplikację.
Chciałbym wiedzieć, czy jest to możliwe. Jeśli tak, to proszę zasugeruj fragmenty kodu, abym mógł spróbować.
Pozdrawiam Girish
źródło
Utwórz
Messenger
obiekt dołączony do twojegoHandler
i przekażMessenger
go doService
(np. WIntent
dodatkowym forstartService()
).Service
Można następnie wysłaćMessage
doHandler
za pośrednictwemMessenger
. Oto przykładowa aplikacja , która to demonstruje.źródło
Handler
, nie możesz uzyskać do niego dostępu, AFAIK.ViewRoot
Android SDK nie ma AFAICT.Handler
/Messenger
, chociaż zastąpiłbym to wszystko magistralą zdarzeń (np. EventBus firmy greenrobot).W tej chwili wolę korzystać z biblioteki event bus, takiej jak Otto do tego rodzaju problemów. Po prostu zasubskrybuj wybrane komponenty (aktywność):
protected void onResume() { super.onResume(); bus.register(this); }
Następnie podaj metodę wywołania zwrotnego:
public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. }
a następnie, gdy twoja usługa wykona instrukcję taką jak ta:
bus.post(new TimeLeftEvent(340));
To POJO zostanie przekazane do twojego powyższego działania i wszystkich innych składników subskrybujących. Prosty i elegancki.
źródło
Proponuję wypróbować następujący kod:
new Handler(Looper.getMainLooper()).post(() -> { //UI THREAD CODE HERE });
źródło
Możesz uzyskać wartości przez odbiornik rozgłoszeniowy ...... w następujący sposób: Najpierw utwórz swój własny filtr IntentFilter jako,
Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER");
Następnie utwórz wewnętrzną klasę BroadcastReceiver as,
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"); } } };
Teraz zarejestruj odbiornik transmisji w onResume () jako,
registerReceiver(broadcastReceiver, intentFilter);
I wreszcie wyrejestruj BroadcastReceiver w onDestroy () as,
unregisterReceiver(broadcastReceiver);
Teraz najważniejsza część ... Musisz odpalić transmisję z dowolnego miejsca, w którym chcesz wysłać wartości ..... więc zrób tak,
Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i);
....Twoje zdrowie :)
źródło
W ten
kotlin
sposób możesz to zrobićPowiedzmy, czy chcesz wyświetlić wiadomość Toast z usługi
val handler = Handler(Looper.getMainLooper()) handler.post { Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show() }
źródło
Rozwiązanie:
Handler
zLooper
z głównego wątku: responseHandler i przesłonhandleMessage
metodaRunnable
zadania wywołaj sendMessage na responseHandlersendMessage
powoduje wywołanie handleMessage w responseHandler.Message
i przetwórz je, zaktualizuj interfejs użytkownikaPrzykładowy kod:
/* 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); }
źródło