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:
2 Pengenalan kelas Pengendali:
3. Carta alir pelaksanaan pengendali:
Analisis carta alir: Kata nama berkaitan
Ringkasnya:
- 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!
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:
Kod pelaksanaan:
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:
//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)
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:android:orientation=" menegak ">main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
<EditText
android:id="@+id/etNum"android:inputType="number" android:layout_width="match_parent" android:layout_height = "wrap_content"
android:hint="Sila masukkan had atas"/>android:layout_height="wrap_content"
android:onClick ="cal"
android:text="Calculation"/>
</LinearLayout>
MainActivity.java:
{
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" ~
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!