美文网首页
AsyncTask使用介绍

AsyncTask使用介绍

作者: CarlosLynn | 来源:发表于2019-11-29 12:33 被阅读0次

    AsyncTask介绍

    AsyncTask可以用来处理一些后台较耗时的任务,查看源码发现其内部就是一个Handler和线程池的封装,可以帮助我们处理耗时任务的同时去更新UI。

    1)AsyncTask抽象类的3参数

    public abstract class AsyncTask<Params, Progress, Result> {
    ......
    }
    
    • Params 启动任务执行的输入参数,比如下载URL
    • Progress 后台任务执行的百分比,比如下载进度
    • Result 后台执行任务最终返回的结果,比如下载结果

    2)继承AsyncTask可以实现的函数

    1. onPreExecute():(运行在UI线程中) (非必须方法,可以不用实现)

    在任务没被线程池执行之前调用,通常用来做一些准备操作,比如下载文件任务执行前,在这个方法中显示一个进度条。

    2.doInBackground(Params... params):(运行在子线程中)(此函数是抽象函数必须实现)

    在任务被线程池执行时调用 ,可以在此方法中处理比较耗时的操作,比如下载文件等等。

    3.onProgressUpdate(Progress... values) (运行在UI线程中) (非必须方法,可以不用实现)

    此函数是任务在线程池中执行处于Running状态,回调给UI主线程的进度,比如上传或者下载进度。

    4.onPostExecute(Result result)(运行在UI线程中) (非必须方法,可以不用实现)

    此函数代表任务在线程池中执行结束了,回调给UI主线程的结果。比如下载结果。

    5.onCancelled(Result result)onCancelled()任务关闭的函数

    3)常用公共函数

    1.cancel (boolean mayInterruptIfRunning)尝试取消这个任务的执行(如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败)

    2.execute (Params... params)用指定的参数来执行此任务(此方法必须在UI线程中调用,因为要将handler绑定到主线程的Looper,方便后台任务执行完毕后,由后台线程切换到UI线程去更新UI)。

    3.executeOnExecutor(Executor exec,Params... params)用指定的参数行此任务,并运行在指定的线程池中(此方法必须在UI线程中调用)

    4.getStatus ()获得任务的当前状态 PENDING(等待执行)、RUNNING(正在运行)、FINISHED(运行完成)

    5.isCancelled ()在任务正常结束之前能成功取消任务则返回true,否则返回false

    注意点

    1)AsyncTask不与任何组件绑定生命周期

    在Activity/或者Fragment中创建执行AsyncTask时,最好在Activity/Fragment的onDestory()调用 cancel(true);

    2)内存泄漏

    如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。

    3)屏幕旋转

    屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。

    4)串行或者并行的执行异步任务

    目前AsyncTask支持并行和串行的执行异步任务,当想要串行执行时,直接执行execute()方法,如果需要并行执行,则要执行executeOnExecutor(Executor)。
    3.0后新增了一个方法executeOnExecutor(Executor exec, Object... params)。第一个是Executor(线程池实例),第二个是任务参数
    Executor主要由四种类型:
    newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若不可回收,则新建线程

    newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

    newScheduledThreadPool:建一个定长线程池,支持定时及周期性任务执行

    newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照顺序执行

    创建线程池方式为:

    asyncTask.executeOnExecutor(Executors.newFixedThreadPool(1), params)

    asyncTask.executeOnExecutor(Executors.newSingleThreadExecutor, params)

    相关文章

      网友评论

          本文标题:AsyncTask使用介绍

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