声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!
目录
系列文章
Handler异步消息传递机制(一)Handler常用基本用法
Handler异步消息传递机制(二)在子线程中创建Handler
Handler异步消息传递机制(三)在主线程、子线程中创建Handler,源码(Android 9.0)解析
Handler异步消息传递机制(四)Handler发送消息流程,源码(Android 9.0)解析
一、简介
Android的消息传递机制主要是为了解决Android应用的多线程问题,而Android平台不允许Activity新启动的子线程访问此Activity里面的界面组件,这样会导致新启动的线程无法动态改变界面组件的属性值。
如:Android实际开发当中,尤其涉及游戏开发经常需要新启动的线程,周期性的去访问改变界面组件的属性值。那么怎么解决呢?我们可以用Handler、AsyncTask相关机制来解决。
这篇我们主要讲Handler,有关AsyncTask介绍可参考:Android专题之AsyncTask(一)基本概念介绍
1、Handler的实现方式?
(1)在主线程中创建Handler,通过回调的方式获取、处理消息
(2)在新启动的线程中发送消息
2、发送消息和处理消息
为了让主线程能更好的处理新启动的线程所发送的消息,显然只能通过回调的方式来实现。
开发者只需要重写Handler类中处理消息的方法,当新启动的子线程发送消息时,Handler类中处理消息的方法被自动回调。
Handler类中包含如下方法发送、处理消息:
二、实战案例
这里我就把以前项目 “app下载更新自动安装” 的代码给改了改,因为主要是演示Handler的用法,所以其它步骤就用模拟或输出的形式呈现!
1、Handler对象在新启动的子线程发送消息
模拟下载app,并在新启动的子线程发送消息
public class DownLoadAppFile {
public void download(String urlPath, Handler handler, ProgressBar pb) {
try {
//下载apk的代码,这里用线程睡眠模拟
Thread.currentThread().sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = Message.obtain();
msg.what =1;//成功
//msg.what =2;//失败
handler.sendMessage(msg);//(子线程)发送消息
}
}
2、在主线程中创建Handler、并获取处理消息
public class MainActivity extends AppCompatActivity {
private TextView show_text;
private String strMsg;
//在主线程中获取、处理消息
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1://下载成功
strMsg = strMsg +"\n"+ "2、apk下载成功。。。开始自动安装下载好的apk!";
show_text.setText(strMsg);
Toast.makeText(MainActivity.this,"apk下载成功!",Toast.LENGTH_SHORT).show();
break;
case 2://下载失败
strMsg = strMsg +"\n"+ "apk下载失败!";
show_text.setText(strMsg);
Toast.makeText(MainActivity.this,"apk下载失败!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_text = (TextView) findViewById(R.id.show_text);
downloadApkFile();
}
/**
* 下载apk文件
* 注:Android 6.0以上需要申请读写权限
*/
private void downloadApkFile() {
strMsg = "1、开始下载apk。。。";
show_text.setText(strMsg);
Toast.makeText(MainActivity.this,"开始下载apk。。。",Toast.LENGTH_SHORT).show();
new Thread() {//在新启动的子线程,调用下载app的代码,并发送消息、反馈结果
public void run() {
DownLoadAppFile downLoadFile = new DownLoadAppFile();
downLoadFile.download(null, handler, null);
};
}.start();
}
}
3、demo 演示效果
demo地址:我的Handler专题系列代码01-Android代码类资源-CSDN下载
效果如下:
三、总结说
1、Handler基本用法
(1)在主线程中创建Handler,通过回调的方式获取、处理消息
(2)在新启动的线程中发送消息
2、Handler能解决的常见问题?
问题:
新启动的线程无法动态改变界面组件的属性值
原因:
Android的消息传递机制主要是为了解决Android应用的多线程问题,
而Android平台不允许Activity新启动的子线程访问此Activity里面的界面组件。
常见使用场景举例:
(1)app升级下载安装,实时更新进度条
(2)游戏开发经常需要新启动的线程,周期性的去访问改变界面组件的属性值