目录
- Handler 消息传递机制
- Handler Looper MessageQueue关系
- Looper 使用
Handler 消息传递机制
Android中每一个应用就是一个进程,Handler消息传递机制 利用JAVA中多线程的概念,比如在主界面 就是UI主线程,同时在UI界面中某个框内消息晃动就是子线程。
机制: Android中子线程不能操作主线程组件 但是场景: 必须在子线程中更新主线程的UI组件,比如下载的进度条显示,子线程复杂下载,但是告诉主线程下载进度条 所以可以使用Handler机制
作用:
1. 在任意的线程中发送消息
2. 在主线程中获取并且 处理消息
// 如何使用Handler周期性的更新消息,比如进度条
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;
// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
final int TIME =; //定义时间长度
final int TIMER_MSG =x001; //定义消息代码
private ProgressBar timer; //声明水平进度条
private int mProgressStatus =; //定义完成进度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = (ProgressBar) findViewById(R.id.timer);
//. 启动进度条
handler.sendEmptyMessage(TIMER_MSG);
}
//创建Handler对象实现秒中更新一次进度
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(TIME - mProgressStatus >){
mProgressStatus +=;
timer.setProgress(TIME-mProgressStatus);
// 通过消息代码进行子线程识别
handler.sendEmptyMessageDelayed(TIMER_MSG,);
}else{
Toast.makeText(MainActivity.this, "时间到!游戏结束!", Toast.LENGTH_SHORT).show(); //提示时间已到
}
}
};
}
Handler Looper MessageQueue关系
Handler 与Looper 中MessageQueue 之间通过Message进行交互
Message是Handler 与Looper 之间交互的桥梁
Message: 对象属性 :
1. Int 整形
2.obj Object类型
3.replyTo 发送到何处 what 自定义的
Message.Obatin()
Handler.obtainMessage() 实现 这两个对象避免创造多余对象 导致对象的消息 Message 对象可以循环利用
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;
// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
final int FLAG_MSG =x001; //定义要发送的消息代码
private ViewFlipper flipper; //定义ViewFlipper
private Message message; //声明消息对象
//定义图片数组
private int[] images = new int[]{R.drawable.img, R.drawable.img2, R.drawable.img3,
R.drawable.img, R.drawable.img5, R.drawable.img6, R.drawable.img7, R.drawable.img8};
private Animation[] animation = new Animation[]; //定义动画数组,为ViewFlipper指定切换动画
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flipper = (ViewFlipper) findViewById(R.id.viewFlipper); //获取ViewFlipper
for (int i =; i < images.length; i++) { //遍历图片数组中的图片
ImageView imageView = new ImageView(this); //创建ImageView对象
imageView.setImageResource(images[i]); //将遍历的图片保存在ImageView中
flipper.addView(imageView); //加载图片
}
//初始化动画数组
animation[] = AnimationUtils.loadAnimation(this, R.anim.slide_in_right); //右侧平移进入动画
animation[] = AnimationUtils.loadAnimation(this, R.anim.slide_out_left); //左侧平移退出动画
flipper.setInAnimation(animation[]); //为flipper设置图片进入动画效果
flipper.setOutAnimation(animation[]); //为flipper设置图片退出动画效果
// 开启广告轮播 主线程中
message = Message.obtain();
message.what = FLAG_MSG;
handler.sendMessage(message);
}
//创建Handler对象实现秒中更新一次进度
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); //获取要发送的消息
handler.sendMessageDelayed(message,); //延迟3秒发送消息
}
};
}
Looper 使用
Handler 在主线程中创建 自动帮我们创建Looper对象
如果在子线程中创建 Handler 中 LooperThread
1. 子线程中创造Handler
2. 初始化Looper对象 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; //声明一个Handler对象
@Override
public void run() {
super.run();
//初始化Looper对象
Looper.prepare();
//实例化一个Handler对象
handler = new Handler() {
public void handleMessage(Message msg) {
Log.i("Looper", String.valueOf(msg.what));
}
};
Message m=handler.obtainMessage(); //获取一个消息
m.what=x7; //设置Message的what属性的值
handler.sendMessage(m); //发送消息
Looper.loop(); //启动Looper
}
}