Android多线程编程(异步通信)--->Handler和AsyncTask

Handler机制:

1)主线程UI:

本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen:

Android多线程编程(异步通信)--->Handler和AsyncTask_第1张图片

2)UI线程模型:

UI主线程不允许其他线程操作组件,只有UI主线程能够绘制界面。

3)分析:子线程发送消息给主线程、主线程发送消息给子线程区别:

  • 子线程发送消息给主线程:由于主线程中本身就有Looper机制,里面有消息队列,所以子线程只需要获得主线程中的Handler对象,用它发送消息,主线程中的Looper会查看到排队的message。
  • 主线程发送消息给子线程:子线程中没有Looper机制,所以需要创建Looper和Handler,然后主线程用子线程中的Handler实例进行发送消息,子线程就能收到。
    图解looper管理消息:
    Android多线程编程(异步通信)--->Handler和AsyncTask_第2张图片

4)范例:倒计时:

功能:点击按钮,开始60秒倒计时,时间再textview显示,结束时,按钮显示“计时结束”。
思路:这里是子线程发送消息给主线程
发送的是count秒数,主线程接收到消息,绘制界面显示到textview中。
Android多线程编程(异步通信)--->Handler和AsyncTask_第3张图片

创建主线程中Handler的子类,重写其handleMessage()方法,接收消息进行处理。what判断消息标识,可以没有,反正都会接收到。

Android多线程编程(异步通信)--->Handler和AsyncTask_第4张图片

创建的子线程中,利用主线程中的handler进行消息发送,设置标识在what中,传入消息在obj中,可以存放任意类型的消息。

效果演示:
Android多线程编程(异步通信)--->Handler和AsyncTask_第5张图片

4)范例:主线程向子线程发送消息。

功能:主线程发送消息,子线程handler收到打出Log
创建子线程,并创建其Looper机制:
Android多线程编程(异步通信)--->Handler和AsyncTask_第6张图片
开启线程:
这里写图片描述
点击按钮,发送消息:

sonHandler.sendEmptyMessage(0);//,获得子线程的sonHandler。向开启的子线程中发消息

AsyncTask:

1.概述:

AsyncTask背后的实现原理也是基于异步消息处理机制。用Handler来封装的。

2.用法:

1>创建子类继承AsyncTask类,指定了三个泛型:
params:执行AsyncTask时需要传入的参数;
progress:后台执行时,如果需要在界面上显示当前的进度。
result:任务执行完毕后,如果需要对结果进行返回。
2>重写的方法:
onPreExecute():在后台任务开始执行前调用,用于进行一些界面上的初始化。
doInBackground():这个方法中所有代码在子线程中都会运行,在这里处理耗时任务。注:这个方法不可以进行UI操作,如果需要可以调用publishProgress(),从而调用了另一个方法onProgressUpdate。
onProgressUpdate():当后台调用了publishProgress,此方法执行,对UI进行操作,进行UI更新。
onPostExecute():后台任务执行完毕,返回值传到这个方法中,可以利用返回的数据来进行一些UI操作。

3.范例:利用AsyncTask模拟进度条下载操作:

功能:按钮点击,进度条显示下载进度,下载完成后将按钮文字改成“已经下载完成”

自定义的AsyncTask子类:

class MyAsyncTask extends AsyncTask<String, String, String>{ //泛型必须是引用数据类型

        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            while(num<=100){
                num++;
                publishProgress(""+num);//使运行onProgressUpdate()方法
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return "运行完毕";//返回值会到onPostExecute()方法中进行操作
        }
        @Override
        protected void onProgressUpdate(String... values) {
            // TODO Auto-generated method stub
            /*values[0],由于传入的仅一个参数,使用values[0]. * 可以传入多个参数的 * */
            int num = Integer.parseInt(values[0]);//得到publishProgress方法传过来的值,操作
            mBarSync.setProgress(num); //将程序进行时的count传到进度条
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub

            super.onPostExecute(result);
            mButtonSyncTask.setText(result);//运行结束后经结果值显示到按钮中。
        }

    }


分析:doInBackground运行在子线程中,秒数–,将秒数通过publishProgress(“”+num)传到onProgressUpdate中,更新进度条,最后结束时,将返回值传给onPostExecute,显示到按钮

开启线程:
这里写图片描述
效果演示:
Android多线程编程(异步通信)--->Handler和AsyncTask_第7张图片

你可能感兴趣的:(多线程,UI,通信,AsyncTask)