Saya mencoba sesuatu yang baru di Android yang saya perlukan untuk mengakses handler UI thread.
Saya tahu yang berikut:
- Rangkaian UI memiliki penangan dan loopernya sendiri
- Pesan apa pun akan dimasukkan ke dalam antrian pesan dari UI thread
- Looper mengambil event tersebut dan memberikannya ke handler
- Handler menangani pesan tersebut dan mengirimkan peristiwa specfic ke UI
Saya ingin memiliki layanan saya yang harus mendapatkan penangan utas UI dan memasukkan pesan ke penangan ini. Sehingga pesan ini akan diproses dan akan dikeluarkan ke UI. Disini service akan menjadi service normal yang akan dijalankan oleh beberapa aplikasi.
Saya ingin tahu apakah ini mungkin. Jika demikian, harap sarankan beberapa cuplikan kode, agar saya dapat mencobanya.
Salam Girish
sumber
Buat
Messenger
objek yang melekat pada AndaHandler
dan berikan ituMessenger
keService
(misalnya, denganIntent
tambahan untukstartService()
). KemudianService
dapat mengirimMessage
keHandler
melaluiMessenger
. Berikut adalah contoh aplikasi yang mendemonstrasikan hal ini.sumber
Handler
, Anda tidak dapat mengaksesnya, AFAIK.ViewRoot
di Android SDK, AFAICT.Handler
/Messenger
, meskipun saya akan mengganti semua itu dengan bus acara (misalnya, EventBus greenrobot).Saat ini saya lebih suka menggunakan perpustakaan bus acara seperti Otto untuk masalah semacam ini. Cukup berlangganan komponen yang diinginkan (aktivitas):
protected void onResume() { super.onResume(); bus.register(this); }
Kemudian berikan metode callback:
public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. }
dan kemudian ketika layanan Anda menjalankan pernyataan seperti ini:
bus.post(new TimeLeftEvent(340));
POJO itu akan diteruskan ke aktivitas Anda di atas dan semua komponen langganan lainnya. Sederhana dan elegan.
sumber
Saya sarankan mencoba kode berikut:
new Handler(Looper.getMainLooper()).post(() -> { //UI THREAD CODE HERE });
sumber
Anda bisa mendapatkan nilai melalui penerima siaran ...... sebagai berikut, Pertama buat IntentFilter Anda sendiri sebagai,
Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER");
Kemudian buat kelas dalam BroadcastReceiver sebagai,
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"); } } };
Sekarang Daftarkan penerima Siaran Anda di onResume () sebagai,
registerReceiver(broadcastReceiver, intentFilter);
Dan terakhir Batalkan pendaftaran BroadcastReceiver di onDestroy () sebagai,
unregisterReceiver(broadcastReceiver);
Sekarang bagian terpenting ... Anda perlu mengaktifkan siaran dari mana pun Anda perlu mengirim nilai ..... jadi lakukan seperti,
Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i);
....Bersulang :)
sumber
Dalam
kotlin
thats bagaimana Anda dapat melakukannyaKatakanlah jika Anda ingin menampilkan pesan Toast dari layanan
val handler = Handler(Looper.getMainLooper()) handler.post { Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show() }
sumber
Larutan:
Handler
denganLooper
dari Main Thread: responseHandler danhandleMessage
metode overrideRunnable
tugas, panggil sendMessage on responseHandlersendMessage
menghasilkan pemanggilan handleMessage di responseHandler.Message
dan proses, perbarui UIKode sampel:
/* 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); }
sumber