美文网首页
AsyncTask详解

AsyncTask详解

作者: kjy_112233 | 来源:发表于2018-09-27 14:12 被阅读0次
  • 一个Android 已封装好的轻量级异步类。属于抽象类,即使用时需实现子类。同时方便在子线程更新UI。封装了Handler和两个线程池。

一、使用详解

(1)方法介绍

  • onPreExecute:在主线程执行,异步任务执行前调用做准备工作
  • doInBackground:在线程池中执行,用于执行异步任务。
  • onProgressUpdate:在主线程执行,后台任务执行进度发生变化会调用此方法。
  • onPostExecute:在主线程执行,接收任务执行结果,将执行结果显示到UI组件。
  • onCancelled:当异步任务取消时调用,而这时候onPostExecute不会被调用。

(2)方法执行顺序

  • 基础使用:execute() → onPreExecute() → doInBackground() → onPostExecute()
  • 显示进度:execute() → onPreExecute() → doInBackground() → onProgressUpdate() → onPostExecute()
  • 终止执行任务:execute() → onPreExecute() → doInBackground() → onCancelled()

二、AsyncTask使用

(1)AsyncTask子类实现

    public class MyAsyncTask extends AsyncTask<String, Integer, String> {
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.v("MyAsyncTask", "准备加载");
        }

        @Override
        protected String doInBackground(String... strings) {
            try {
                int count = 0;
                while (count < 99) {
                    count ++;
                    publishProgress(count);
                    //模拟耗时任务
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.v("MyAsyncTask", "已加载" + values[0] + "%");
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.v("MyAsyncTask", "加载完毕");
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.v("MyAsyncTask", "取消加载");
        }
    }

(2)调用代码

MyAsyncTask asyncTask = new MyAsyncTask();
asyncTask.execute();//开始加载
asyncTask.cancel(true);//取消加载

优点

  • 方便实现异步通信:不需使用 “任务线程(继承Thread类) + Handler”的复杂组合
  • 节省资源:采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销

缺点

  • 多个异步操作需要更新UI时,就变得麻烦起来。

注意事项

  • AsyncTask对象必须在主线程实例化,类必须在主线程加载;execute()方法必须在UI线程调用。
  • 一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则报运行时异常
  • 若AsyncTask被声明为Activity的非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity的引用而导致Activity无法被回收,最终引起内存泄露。
  • 线程任务执行结果丢失,当Activity重新创建时之前运行的AsyncTask持有的之前Activity引用已无效,故复写的onPostExecute()将不生效,即无法更新UI操作。

相关文章

  • android 源码分析(五AsyncTask机制详解)

    AsyncTask机制详解 AsyncTask用法回顾 AsyncTask类主要用到的几个内部回调函数有:doIn...

  • 3.2异步消息处理机制-AsyncTask

    AsyncTask详解 什么事AsyncTask AsyncTask的使用方法三个参数(泛型指定的三个)5个方法 ...

  • 第三十周 AsyncTask

    话题:AsyncTask 的使用方式和版本演进 关键字:艺术探索、Google 参考答案 AsyncTask 详解...

  • Android AsyncTask 详解

    Android AsyncTask 详解 内容划分 AsyncTask简介 简单使用 繁杂部分和源码浅析 一些坑的...

  • AsyncTask详解

    一个Android 已封装好的轻量级异步类。属于抽象类,即使用时需实现子类。同时方便在子线程更新UI。封装了Han...

  • AsyncTask详解

    AsyncTask是什么? AsyncTask这个类允许在后台执行操作并在UI线程上更新结果而不用必须操纵主线程或...

  • AsyncTask详解

    文章转自郭霖:http://blog.csdn.net/guolin_blog/article/details/1...

  • AsyncTask详解

    一.什么是AsyncTask 它本质上是封装了线程池和handler的异步框架,主要执行异步任务 二.AsyncT...

  • AsyncTask详解

    android中实现异步任务有两种方式Handler和AsyncTask handler需要为每个任务创建一个新的...

  • AsyncTask详解

    AsyncTask的使用大家应该都不陌生,内部原理就是线程池与Handler的运用。简单的使用 现在有个疑问是 怎...

网友评论

      本文标题:AsyncTask详解

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