版权声明:本文为博主原创文章,不得随意转载,转载请注明出处!!! https://blog.csdn.net/YuDBL/article/details/85594530
声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!
文章目录
前言简介
Android的消息传递机制主要是为了解决Android应用的多线程问题,Android平台不允许Activity新启动的子线程访问该Activity里面的界面组件,这样会导致新启动的线程无法动态改变界面组件的属性值。如:Android实际开发当中,尤其涉及游戏开发经常需要新启动的线程,周期性的去访问改变界面组件的属性值。那么怎么解决呢?我们可以用Handler、AsyncTask相关机制来解决,这篇我们主要讲Handler,有关AsyncTask介绍可参考:Android专题之AsyncTask(一)基本概念介绍
1、Handler的实现方式?
(1)在新启动的线程中发送消息 (2)在主线程中获取、处理消息
2、那么新启动的子线程何时发送消息呢?主线程何时去处获取并处理消息呢?
为了让主线程能更好的处理新启动的线程所发送的消息,显然只能通过回调的方式来实现,开发者只需要重写Handler类中处理消息的方法,当新启动的子线程发送消息时,Handler类中处理消息的方法被自动回调。Handler类中包含如下方法发送、处理消息
实战案例
这里我就把以前项目 “app下载更新自动安装” 的代码给改了改,因为主要是演示Handler的用法,所以其它步骤就用模拟或输出的形式呈现!
1、在新启动的子线程发送消息
模拟下载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、在主线程中获取、处理消息
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地址:https://download.csdn.net/download/yudbl/10894028
效果如下: