AsyncTask

作者: 森屿暖茶 | 来源:发表于2021-04-28 16:49 被阅读0次

    AsyncTask

    一个Android 已封装好的轻量级异步类,属于抽象类,即使用时需 实现子类

    意义

    在工作线程中多线程异步执行任务,如 耗时任务,并将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作。

    方法

    使用(推荐实例对象使用,静态内部类使用容易持有Activity,如果处理不好容易造成内存泄漏)

    1.创建AsyncTask的实现类。

    2.实例化子类,并调用执行

    相当于执行开启一个线程执行Run(一般不这么使用)

    AsyncTask运行机制

    内部实现一个InternalHandler,在工作线程执行结果,在主线程更新UI。

    AsyncTask的串行并行问题

    串行

    在默认情况下调用execute()方法,AsyncTask是串行的,为什么呢?直接看源码。

    看到这里我们明白了,由于队列是先进先出的,所以任务会根据任务的提交顺序,进行顺序执行。

    并行

    在调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)时,AsyncTask是并行的,为什么呢?直接看源码。

    SynchronousQueue队列(不存储元素的队列),在这里作用:只要可以提交到线程运行任务就提交到线程执行任务

    看到这里我们明白了,由于线程池的默认设置(线程池相关内容不详细解释了,不明白可以看线程相关内容),提交的任务会在线程池中执行。当然我们可以自定义线程池传入给executeOnExecutor方法,那样AsyncTask的任务就会按照我们配置的线程池特性执行任务了。

    PS:通过源码分析我们知道,由于SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR被声明为static,所以,同一个进程里的AsyncTask都会共享这个线程池(原因请查看JVM)。所以你不管new 多少AsyncTask实例,他都是在你设置的池子里运行。所以你完全不用担心new AsyncTask实例会产生多个线程池帮你执行任务,除非你自定义线程池。

    总结

    注意AsyncTask的串行并行使用,注意AsyncTask是线程调度的,要合理释放和持有对象,避免内存泄漏

    相关文章

      网友评论

          本文标题:AsyncTask

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