AsyncTask深入解读(上)

作者: MrHorse1992 | 来源:发表于2018-08-13 13:03 被阅读109次

1 AsyncTask作用

AsyncTask是安卓开发中使用的一种轻量级异步任务类。其作用是在线程池中执行后台任务,并在执行过程中将执行进度传递给主线程,当任务执行完毕后,将最终结果传递给主线程。


2 AsyncTask产生背景

安卓系统线程分为主线程和子线程,主线程也叫UI线程。主线程主要负责与用户交互。为了更好的用户体验,保证系统不因主线程的阻塞而产生卡顿,安卓系统要求主线程中不能执行耗时任务。例如:IO操作、网络请求等必须在子线程中完成。AsyncTask就是为了适应这种需要而产生。


3 AsyncTask使用场景

AsyncTask是一种轻量级的异步线程,虽然使用AsyncTask可以更加方便的执行后台任务与在主线程中访问UI,但是AsyncTask不适合执行特别耗时的后台任务。具体原因会在后续分析中阐明。


4 AsyncTask使用方式

AsyncTask原型:

public abstract class AsyncTask<Params, Progress, Result>

由原型可见AsyncTask是一个泛型抽象类。
参数说明:

Params 执行后台任务所需参数类型
Progress 后台任务执行进度的类型
Result 后台任务执行完毕后返回结果类型
AsyncTask 核心方法:

AsyncTask提供4个核心方法:
1) protected void onPreExecute()

执行线程 主线程
调用时间 异步任务执行之前
方法作用 异步任务执行前的初始化工作

2)protected Result doInBackground(Params...params)

执行线程 线程池中执行
调用时间 任务开始后到任务结束之前
方法作用 用于执行异步任务

3)protected void onProgressUpdate(Prgress...values)

执行线程 主线程
调用时间 任务开始后到任务结束之前
方法作用 用于更新任务进度

4)protected void onPostExecute(Result result)

执行线程 主线程
调用时间 异步任务执行之后
方法作用 将异步任务的执行结果传递给主线程

了解各个参数以及方法含义后我们来看一段官方给出的AsyncTask示例程序:

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
        //任务执行前的准备工作
        protected void onPreExecute(){
        }
        protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                
                 totalSize += Downloader.downloadFile(urls[i]);
                 
                 //更新下载进度,publishProgress会调用onProgressUpdate
                 publishProgress((int) ((i / (float) count) * 100));
                 // Escape early if cancel() is called
                 if (isCancelled()) break;
             }
              return totalSize;
          }
     
         //主线程中调用,主要用于更新后台任务进度
         protected void onProgressUpdate(Integer... progress) {
              setProgressPercent(progress[0]);
          }
     
          //任务执行完毕
          protected void onPostExecute(Long result) {
              showDialog("Downloaded " + result + " bytes");
          }
      }

DownloadFilesTask类模拟文件下载过程。传入的参数Params类型为URL(文件地址),后台任务进程参数Progress类型为Integer(下载进度),后台任务返回结果参数Result类型为Long(总文件大小)。


5 AsyncTask使用注意

通过简单的官方示例程序学习了AsyncTask的使用方法,那么使用AsyncTask需要注意以下几个条件:
1)AsyncTask类必须在主线程加载
2)AsyncTask对象必须在主线程创建
3)execute方法必须在主线程调用
4)不要在程序中直接调用AsyncTask提供的4个核心方法
5)一个AsyncTask对象只能执行一次,即只能调用一次execute


6 小结

通过本节的介绍,对AsyncTask有了初步的认识,下一节AsyncTask深入解读(下)将从AsyncTask源码出发,分析AsyncTask的工作原理以及回答本节中留下的问题。

相关文章

网友评论

    本文标题:AsyncTask深入解读(上)

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