Android Handler消息傳遞機(jī)制
Handler 消息傳遞機(jī)制
Android中每一個(gè)應(yīng)用就是一個(gè)進(jìn)程,Handler消息傳遞機(jī)制 利用JAVA中多線程的概念,比如在主界面 就是UI主線程,同時(shí)在UI界面中某個(gè)框內(nèi)消息晃動(dòng)就是子線程。
機(jī)制: Android中子線程不能操作主線程組件 但是場景: 必須在子線程中更新主線程的UI組件,比如下載的進(jìn)度條顯示,子線程復(fù)雜下載,但是告訴主線程下載進(jìn)度條 所以可以使用Handler機(jī)制
作用:
1. 在任意的線程中發(fā)送消息
2. 在主線程中獲取并且 處理消息
// 如何使用Handler周期性的更新消息,比如進(jìn)度條 package com.example.myapplication; import android.content.ContentResolver; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.ContactsContract; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; // 從手機(jī)的通訊錄中獲取信息 public class MainActivity extends AppCompatActivity { final int TIME = 60; //定義時(shí)間長度 final int TIMER_MSG = 0x001; //定義消息代碼 private ProgressBar timer; //聲明水平進(jìn)度條 private int mProgressStatus = 0; //定義完成進(jìn)度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timer = (ProgressBar) findViewById(R.id.timer); // 3. 啟動(dòng)進(jìn)度條 handler.sendEmptyMessage(TIMER_MSG); } //創(chuàng)建Handler對(duì)象實(shí)現(xiàn)1秒中更新一次進(jìn)度 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(TIME - mProgressStatus > 0){ mProgressStatus +=1; timer.setProgress(TIME-mProgressStatus); // 通過消息代碼進(jìn)行子線程識(shí)別 handler.sendEmptyMessageDelayed(TIMER_MSG,1000); }else{ Toast.makeText(MainActivity.this, "時(shí)間到!游戲結(jié)束!", Toast.LENGTH_SHORT).show(); //提示時(shí)間已到 } } }; }
Handler Looper MessageQueue關(guān)系
Handler 與Looper 中MessageQueue 之間通過Message進(jìn)行交互
Message是Handler 與Looper 之間交互的橋梁
Message: 對(duì)象屬性 :
1. Int 整形
2.obj Object類型
3.replyTo 發(fā)送到何處 what 自定義的
Message.Obatin()
Handler.obtainMessage() 實(shí)現(xiàn) 這兩個(gè)對(duì)象避免創(chuàng)造多余對(duì)象 導(dǎo)致對(duì)象的消息 Message 對(duì)象可以循環(huán)利用
package com.example.myapplication; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Toast; import android.widget.ViewFlipper; import androidx.appcompat.app.AppCompatActivity; // 從手機(jī)的通訊錄中獲取信息 public class MainActivity extends AppCompatActivity { final int FLAG_MSG = 0x001; //定義要發(fā)送的消息代碼 private ViewFlipper flipper; //定義ViewFlipper private Message message; //聲明消息對(duì)象 //定義圖片數(shù)組 private int[] images = new int[]{R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5, R.drawable.img6, R.drawable.img7, R.drawable.img8}; private Animation[] animation = new Animation[2]; //定義動(dòng)畫數(shù)組,為ViewFlipper指定切換動(dòng)畫 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); flipper = (ViewFlipper) findViewById(R.id.viewFlipper); //獲取ViewFlipper for (int i = 0; i < images.length; i++) { //遍歷圖片數(shù)組中的圖片 ImageView imageView = new ImageView(this); //創(chuàng)建ImageView對(duì)象 imageView.setImageResource(images[i]); //將遍歷的圖片保存在ImageView中 flipper.addView(imageView); //加載圖片 } //初始化動(dòng)畫數(shù)組 animation[0] = AnimationUtils.loadAnimation(this, R.anim.slide_in_right); //右側(cè)平移進(jìn)入動(dòng)畫 animation[1] = AnimationUtils.loadAnimation(this, R.anim.slide_out_left); //左側(cè)平移退出動(dòng)畫 flipper.setInAnimation(animation[0]); //為flipper設(shè)置圖片進(jìn)入動(dòng)畫效果 flipper.setOutAnimation(animation[1]); //為flipper設(shè)置圖片退出動(dòng)畫效果 // 開啟廣告輪播 主線程中 message = Message.obtain(); message.what = FLAG_MSG; handler.sendMessage(message); } //創(chuàng)建Handler對(duì)象實(shí)現(xiàn)1秒中更新一次進(jìn)度 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == FLAG_MSG) { flipper.showPrevious(); //示下一張圖片 } message = handler.obtainMessage(FLAG_MSG); //獲取要發(fā)送的消息 handler.sendMessageDelayed(message, 3000); //延遲3秒發(fā)送消息 } }; }
Looper 使用
Handler 在主線程中創(chuàng)建 自動(dòng)幫我們創(chuàng)建Looper對(duì)象
如果在子線程中創(chuàng)建 Handler 中 LooperThread
1. 子線程中創(chuàng)造Handler
2. 初始化Looper對(duì)象 Looper.prepare()
3.new Handler()
4.looper.loop
package com.example.myapplication; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; public class LooperThread extends Thread { public Handler handler; //聲明一個(gè)Handler對(duì)象 @Override public void run() { super.run(); //初始化Looper對(duì)象 Looper.prepare(); //實(shí)例化一個(gè)Handler對(duì)象 handler = new Handler() { public void handleMessage(Message msg) { Log.i("Looper", String.valueOf(msg.what)); } }; Message m=handler.obtainMessage(); //獲取一個(gè)消息 m.what=0x7; //設(shè)置Message的what屬性的值 handler.sendMessage(m); //發(fā)送消息 Looper.loop(); //啟動(dòng)Looper } }
到此這篇關(guān)于Android Handler消息傳遞機(jī)制的文章就介紹到這了,更多相關(guān)Android Handler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android開發(fā)教程之startActivityForResult使用方法
這篇文章主要介紹了android開發(fā)教程之startActivityForResult使用方法,需要的朋友可以參考下2014-03-03Android短信驗(yàn)證碼自動(dòng)填寫實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android短信驗(yàn)證碼自動(dòng)填寫實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05BottomNavigationView?ViewPager2?Fragment底部菜單導(dǎo)航欄
這篇文章主要為大家介紹了BottomNavigationView?ViewPager2?Fragment底部菜單導(dǎo)航欄實(shí)現(xiàn)效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android自定義密碼樣式 黑點(diǎn)轉(zhuǎn)換成特殊字符
這篇文章主要為大家詳細(xì)介紹了Android自定義密碼樣式的制作方法,黑點(diǎn)換成¥、%等特殊字符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07