Handler异步消息传递机制(一)Handler常用基本用法

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!

目录

一、简介

1、Handler的实现方式?

2、发送消息和处理消息

二、实战案例

1、Handler对象在新启动的子线程发送消息

2、在主线程中创建Handler、并获取处理消息

3、demo 演示效果

三、总结说

1、Handler基本用法

2、Handler能解决的常见问题?


系列文章

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)游戏开发经常需要新启动的线程,周期性的去访问改变界面组件的属性值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值