美文网首页
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