Analisis ringkas mekanisme penghantaran mesej Pengendali


Pengenalan kepada bahagian ini

Dalam dua bahagian pertama, kami telah mengkaji dua mekanisme pemprosesan acara dalam Android Hanya terdapat dua jenis respons acara ini Ia adalah Pengendali pemindahan maklumat dalam komponen UI dalam Aktiviti Saya percaya ramai rakan tahu bahawa demi keselamatan utas, Android tidak membenarkan kami mengendalikan UI di luar utas UI berkali-kali apabila kami menyegarkan antara muka, kami perlu memaklumkan kemas kini komponen UI melalui Pengendali! Selain menggunakan Handler untuk melengkapkan kemas kini antara muka, anda juga boleh menggunakan runOnUiThread() untuk mengemas kini, atau bas transaksi yang lebih maju Sudah tentu, di sini kami hanya menerangkan Handler, apakah itu Handler, proses pelaksanaan, kaedah berkaitan dan penggunaan dalam sub -benang dan utas utama Perbezaan antara Pengendali dan banyak lagi!


Pelan hala tuju pembelajaran:

1.jpg


2 Pengenalan kelas Pengendali:

2.jpg


3. Carta alir pelaksanaan pengendali:

3.jpg

Analisis carta alir: Kata nama berkaitan

  • Urutan UI : Ia adalah utas utama kami apabila sistem mencipta utas UI, ia akan memulakan objek Looper dan juga membuat MessageQueue yang dikaitkan dengannya
  • Pengendali: Fungsinya adalah untuk menghantar dan memproses maklumat Jika anda mahu Pengendali berfungsi seperti biasa, mesti ada objek Looper dalam utas semasa
  • Mesej<. 🎜>: Objek mesej diterima dan diproses oleh Pengendali
  • MessageQueue
  • : Baris gilir mesej, pengurusan pertama masuk dahulu keluar Mesej, apabila memulakan objek Looper, MessageQueue yang dikaitkan dengannya akan menjadi dicipta;
  • Looper
  • : Setiap utas hanya boleh mempunyai satu Looper, yang menguruskan MessageQueue dan terus mengekstrak Mesej daripadanya dan mengedarkannya kepada Pengendali yang sepadan untuk diproses!
Ringkasnya:

Apabila urutan anak kita mahu mengubah suai komponen UI dalam Aktiviti, kita boleh mencipta Objek Pengendali baharu, hantar maklumat ke utas utama melalui objek ini dan maklumat yang kami hantar akan menunggu dahulu dalam MessageQueue utas utama, dibawa keluar oleh Looper dalam urutan masuk dahulu, keluar dahulu, dan kemudian diedarkan kepada Pengendali yang sepadan untuk pemprosesan mengikut atribut apa objek mesej!

4. Kaedah Pengendali yang berkaitan:

  • void handleMessage(Mesej mesej): Kaedah untuk memproses mesej, biasanya digunakan Overridden!
  • sendEmptyMessage(int what): Hantar mesej kosong
  • sendEmptyMessageDelayed(int what, long delayMillis): Tentukan kelewatan Hantar mesej kosong selepas milisaat
  • sendMessage(Message msg): Hantar mesej segera
  • sendMessageDelayed(Message msg): Tentukan kelewatan selepas berapa milisaat Hantar mesej
  • boolean akhir hasMessage(int what): Semak sama ada baris gilir mesej mengandungi mesej dengan atribut what sebagai nilai yang ditentukan Jika parameter ialah (int what, Object object): Selain menilai atribut what, anda juga perlu menilai sama ada atribut Object ialah mesej untuk objek yang ditentukan

5. Contoh penggunaan pengendali:

1) Pengendali ditulis dalam utas utama

Dalam utas utama, kerana sistem telah memulakan objek Looper, kami terus mencipta Handler membantah untuk menghantar maklumat dan menanganinya!

Contoh kod: Atur cara mudah yang menukar imej secara kerap Melalui pemasa Pemasa, ia kerap mengubah suai kandungan yang dipaparkan oleh ImageView untuk membentuk animasi bingkai

<🎜. >

Menjalankan pemaparan:

4.gif

Kod pelaksanaan:

< ; RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id= " @+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.jay.example . handlerdemo1.MainActivity" >

<ImageView
android:id="@+id/imgchange"
android:layout_width="wrap_content"
android: layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />

</RelativeLayout>

MainActivity.java:

MainActivity kelas awam memanjangkan Aktiviti {

//Tentukan id tatasusunan imej yang ditukar
int imgids[] = new int[]{
R.drawable.s_1, R .drawable.s_2,R.drawable.s_3,
R.drawable.s_4,R.drawable.s_5,R.drawable.s_6,
R.drawable.s_7,R.drawable.s_8
} ;
int imgstart = 0;

Pengendali akhir myHandler = new Handler()
{ Lakukan operasi seterusnya
public void handleMessage(Message msg) {
if(msg.what == 0x123)
{
imgchange.setImageResource(imgids[img start++ % 8]); activity_main );
final ImageView imgchange = (ImageView) findViewById(R.id.imgchange); ) .jadual(PemasaTask() baharu {                                                                                              myHandler.sendEmptyMessage(0x123);
                                     🎜>


2) Pengendali ditulis dalam Dalam sub-thread <>
kami. perlu mencipta objek Looper sendiri! , dan pembinanya akan mencipta MessageQueue yang sepadan;
2)
Buat objek Pengendali dan mengatasi kaedah handleMessage() Memproses maklumat daripada urutan lain!
3)
Panggil Looper.loop() kaedah untuk memulakan Looper

Contoh penggunaan: Masukkan nombor, dan selepas pengiraan, keluarkan semua nombor perdana dalam julat ini melalui Toast

Kod pelaksanaan:

main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

android:layout_height="match_parent"
android:orientation=" menegak ">

<EditText

android:id="@+id/etNum"

android:inputType="number" android:layout_width="match_parent" android:layout_height = "wrap_content"

android:hint="Sila masukkan had atas"/>
<Butang
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick ="cal"
android:text="Calculation"/>
</LinearLayout>

MainActivity.java:

kelas awam CalPrime melanjutkan Aktiviti
{
String akhir statik UPPER_NUM = "atas";
EditText etNum; > class CalThread memanjangkan Thread
{
public Handler mHandler

public void run()
{ Looper.prepare();
mHandler = new Handler()
      { 🎜>                                                                                                                                                                                                                            > Int UPPER = msg.getdata (). Getint (nombor_ atas);untuk (int i = 2; i & lt; = atas; i ++)
; = math.sqrt (i);
teruskan ke luar;
                                                                                                                                                                      //Gunakan Toast untuk memaparkan semua nombor perdana yang dikira
, Toast.makeText(CalPrime.this, nums.toString()
, Toast.LENGTH_LONG).show() ; 
                                                                                             }; .onCreate(savedInstanceState);
setContentView(R.layout.main); Mulakan urutan baharu
calThread start();
}
// Menyediakan fungsi pengendali acara untuk acara klik butang
public void cal(Lihat sumber)
{
// Cipta mesej
Mesej msg = new Message();
msg.what = 0x123;
Bundle bundle = new Bundle(); getText().toString()) );
msg.setData(bundle);//Hantar mesej kepada Pengendali dalam urutan baharu
calThread.mHandler.sendMessage(msg); Edaran" ~

Ringkasan bahagian ini

Bahagian ini menjalankan analisis ringkas penghantaran acara Pengendali dalam Android. Ia adalah perlu untuk membezakan Pengendali, Mesej, MessageQueue, Konsep Gelung, dan perbezaan antara Pengendali yang ditulis dalam utas utama dan sub-benang!