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中子線程不能操作主線程組件 但是場(chǎng)景: 必須在子線程中更新主線程的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í)間長(zhǎng)度
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 Rreact Native 常見錯(cuò)誤總結(jié)
這篇文章主要介紹了Android Rreact Native 常見錯(cuò)誤總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-06-06
在Flutter中讓文字Text換行的實(shí)現(xiàn)步驟
在Flutter中,Text小部件默認(rèn)會(huì)嘗試在其父小部件的約束內(nèi)顯示所有文本內(nèi)容,如果父小部件沒有提供足夠的空間或沒有設(shè)置約束限制,Text小部件可能無法正確換行,本文給大家介紹了在Flutter中如何讓文字Text換行,需要的朋友可以參考下2024-07-07
Android自定義View實(shí)現(xiàn)自動(dòng)轉(zhuǎn)圈效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)自動(dòng)轉(zhuǎn)圈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android用ListView顯示SDCard文件列表的小例子
本文簡(jiǎn)單實(shí)現(xiàn)了用ListView顯示SDCard文件列表,目錄的回退等功能暫不討論,獲取文件列表,files即為所選擇目錄下的所有文件列表2013-11-11
android使用AsyncTask實(shí)現(xiàn)多線程下載實(shí)例
這篇文章主要介紹了android使用AsyncTask實(shí)現(xiàn)多線程下載實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
關(guān)于Kotlin的自動(dòng)類型轉(zhuǎn)換詳解
這篇文章主要給大家介紹了關(guān)于Kotlin的自動(dòng)類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Android 圖像處理(類型轉(zhuǎn)換,比例縮放,倒影,圓角)的小例子
Android 圖像處理(類型轉(zhuǎn)換,比例縮放,倒影,圓角)的小例子,需要的朋友可以參考一下2013-05-05

