Handler消息传递机制(一)简介

版权声明:本文为博主原创文章,不得随意转载,转载请注明出处!!! https://blog.csdn.net/YuDBL/article/details/85594530

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

文章目录

前言简介

实战案例

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

2、在主线程中获取、处理消息

3、我的demo 和 演示效果


前言简介

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

效果如下:

猜你喜欢

转载自blog.csdn.net/YuDBL/article/details/85594530
今日推荐