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

    相关文章

      网友评论

          本文标题:AsyncTask详解

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