美文网首页
3.2异步消息处理机制-AsyncTask

3.2异步消息处理机制-AsyncTask

作者: 205蚁 | 来源:发表于2018-11-09 09:55 被阅读0次

    AsyncTask详解

      1. 什么事AsyncTask
      1. AsyncTask的使用方法
        1. 三个参数(泛型指定的三个)
        1. 5个方法
      1. AsyncTask内部原理
      1. AsyncTask的注意事项

    1.什么事AsyncTask

      1. 本质上是一个封装了线程池和handler的异步框架 ·
    • 2 AsyncTask 可以使开发者避免使用Handler和Thread 来直接处理后台操作,执行异步任务,在子线程和UI线程灵活的切换
      • 注意:AsyncTask只能做一些耗时比较短的操作,如果想做耗时比较长的操作,最好用线程池

    2.AsyncTask的使用方法

      1. 三个参数(泛型指定的三个)
      1. 2.5个方法
        图:


        4
    public class UpdateInfoAsyncTask extends AsyncTask<Integer,Integer,String>{
                
                protected void onPreExecute(){
                    textView.setText("开始执行异步框架");
                }
                protected String doInBackground(Integer...params){//为什么是可变参数,说明可以传入过个参数,但是类型已经确定
                    int i = 0;
                    for(i=10;i<=100;i+=10){
                        publicProgress(i);
                    }
                    return i+ params[0].intValue()+"";
                    
                }
                
                protected void onProgressUpdate(Integer... values){
                    int value = values[0];
                    progessBar.setProgess(value);
                }
                protected void onPostExecute(String result){
                    textView.setText("异步操作执行结束"+result); 
                }
    }
    
    参数1:执行操作传入
    参数2:进度 返回
    参数3:结果返回
    
    onPreExecute 在UI线程中,开启进度条,提示等
    doInBackground 在线程池中
        publicProgress(i)会将参数 回调到onProgressUpdate
    onPostExecute 回到UI线程中,处理结果  
    

    3.AsyncTask内部原理

    • 熟悉Handler之后,可知android应用的主线程肩负着绘制用户界面,及时效应用户操作的重任,要确保不出现ANR,需时刻保持较高的响应

    • 异步机制,本质上都是对Hanlder、线程、以及线程池的封装

      • 框架整体结构:

          1. AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
          1. 线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
          1. 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数。
      • 总结:内部是封装了线程池,通过handler来发送消息,在uI线程和子线程传递

    4.AsyncTask的注意事项

      1. 内存泄露:原因跟handler差不多。
        • 非静态内部类会持有外部类的引用,导致外部对象想被销毁时,因为被持有而无法被内存回收(内存泄露)

        • 1.设置静态 2.持有弱引用外部对象 3.在ondestroy时执行cancel()方法

        1. 生命周期
        • 线程池的操作咋会跟组件生命周期跟着走。。
        1. 结果丢失
          1. 界面旋转
          1. 被直接杀掉,如果是静态,AsyncTask会持有已经销毁的引用,这时线程池任务执行完之后调用onPostExecute方法更新界面,这是不会再生效
      • 4.并行or串行

        • 2.3之后 串行
        • 有方法执行串行,线程池内部不稳定

    相关文章

      网友评论

          本文标题:3.2异步消息处理机制-AsyncTask

          本文链接:https://www.haomeiwen.com/subject/zqenxqtx.html