安卓多任务实现机制理论:Handler和AsyncTask

Android是单线程模式 只有1个Main线程也就是UI线程 各种事件,视图的绘制都是在这部分完成的
当执行耗时操作时,如果超过5S 就会出现ANR错误 因此在耗时操作时要开子线程
不能在UI线程外访问UI组件 基础操作都要在UI线程中完成,耗时操作创建新线程完成

UI线程外的线程被称为工作线程(完成耗时的操作)

多任务的实现原理
线程中通信的方式 AsyncTask和Handler机制

AsyncTask
    是安卓框架中实现的异步处理的辅助类,耗时操作在工作线程中完成,处理结果在Main线程中执行
    该机制屏蔽掉了多线程和handler的概念,对他们进行了高度的封装 
    onPreExecute预处理方法,doInBackgroud后台执行方法,publishProgress更新进度,onPostExecute返回结果方法......

handler
    通过消息队列进行通信的方式,通过Handler,looper,MessageQueue和Message这几个类来协调完成
    Handler 在android里负责发送和处理消息,通过它可以实现其他线程和Main线程之间的消息通讯
    Looper 负责管理线程的消息队列和消息循环
    MessageQueue 消息队列,先进先出,它的作用是保存有待线程处理的消息
    Message 线程间通讯的载体,Message充当着消息封装的功能,里面可以存放任何想要传递的消息

    具体是实现是
        1.工作线程想给主线程发Messgae
        2.工作线程先把Messgae发送到MessageQueue中
        3.主线程中有Looper可以检测到MessgaeQueue中消息的变化,有消息时就可以取出来,这时就会掉Handler的回调handleMessage方法,拿到结果

    Looper类
        线程通过looper对象可以读写某个消息循环队列
        ·Looper.myLooper() 得到当前looper对象
        ·Looper.getMainLooper() 可以获得当前进程的主线程的Looper对象
        ·Looper.prepare() 创建消息队列
        ·Looper.loop() 进入消息循环

    Handler类
        UI主线程在被创建时会主动创建一个消息队列和消息循环,主线程的Looper通过创建1个Handler对象,对外界提供了访问消息队列的渠道
        ·主线程通过Handler.handleMessage()读取消息队列中的消息
        ·工作线程通过以下方法发送消息到主线程的消息队列
            ·Handler.sendMessgae()
            ·Handler.post()

安卓中有2种方式实现多线程来操作UI
·第一种就是创建线程Thread,通过Handler负责线程间的通信和消息
·第二种是通过AsyncTask异步执行任务

    一·用Handler来实现多任务
    ·在新的线程中调用主线程的Handler的postXXX和sendMessage()方法来实现与主线程通信
    
    ·具体步骤如下
        ·1.创建一个Handler对象
        ·2.将要执行的操作卸载线程对象的 run方法中
        ·3.使用post方法运行线程对象
        ·4.如果需要循环执行,需要在线程对象的run方法中再次调用post方法

    二 通过AsyncTask来实现多任务
    通过继承AsyncTask类来实现耗时操作,该类是抽象类,有3个泛型参数  params,集成AsyncTask的类的具体实现执行execute传入参数,Progress,更新进度,有publishProgress传给onupdateProgress result返回的结果集
    
    ·具体步骤如下
        ·1.创建AsyncTask子类,根据需求重写其中的方法,其中doInBackground是必须实现的,完成耗时的操作
        ·2.创建AsyncTask的子类的实例对象,
        ·3.调用execute方法,开启异步线程任务
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值