Android必学-AsyncTask基础
http://www.imooc.com/learn/377

github源码Android Studio2.3.1:
https://github.com/kakukeme/Android_Learn/tree/master/AsyncTaskTest

Android必学之AsyncTask
http://www.cnblogs.com/caobotao/p/5020857.html

第1章 AsyncTask的基本构成

1-1 AsyncTask概述

  • 为什么要异步任务

1、Android单线程模型
2、耗时操作放在非主线程中执行;

  • AsyncTask为何而生

1、子线程中更新UI
2、封装、简化异步操作

1-2 AsyncTask基本结构介绍

  • 1、构建AsyncTask子类的参数

AsyncTask是一个抽象类,通常用于被继承,继承AsyncTask需要制定如下三个泛型参数;

Params:启动任务时输入参数的类型。
Progress:后台任务执行中返回进度值得类型。
Result:后台执行任务完成后返回结果的类型。

  • 2、构建AsyncTask子类的回调方法

doInBackground:必须重写,异步执行后台线程将要完成的任务

onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作

onPostExecute:当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法

onProgressUpdate:在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法;

// 启动AsyncTask

执行顺序:
onPreExecute------>doInBackground------>onProgressUpdate------>onPostExecute

Cmd + N 获取 Generate Override Methods

自定义AsyncTask

public class MyAsyncTask extends AsyncTask {    @Override    protected Void doInBackground(Void... params) {        Log.d("xys", "doInBackground");        return null;    }    @Override    protected void onPreExecute() {        super.onPreExecute();        Log.d("xys", "onPreExecute");    }    @Override    protected void onPostExecute(Void aVoid) {        super.onPostExecute(aVoid);        Log.d("xys", "onPostExecute");    }    @Override    protected void onProgressUpdate(Void... values) {        super.onProgressUpdate(values);        Log.d("xys", "onProgressUpdate");    }}

启动AsyncTask

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        MyAsyncTask task = new MyAsyncTask();        task.execute();     // 启动AsyncTask    }}

第2章 AsyncTask的使用示例

2-1 AsyncTask创建UI

典型的异步处理:加载一张网络图片;

异步处理---->下载图像
UI线程------>设置图像

2-2 创建AsyncTask类

2-3 与UI线程通信

onPreExecute - 加载进度条

doInBackground - 下载网络数据(耗时操作)

onPostExecute - 显示图片

// 访问网络权限// 增加Activity

MainActivity 增加点击跳转事件

// activity_main.xml

第3章 AsyncTask模拟进度条

3-1 AsyncTask模拟进度条

public class ProgressBarTest extends Activity {    private ProgressBar mProgressBar;    private ProgressAsyncTask mTask;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.progressbar);        mProgressBar = (ProgressBar) findViewById(R.id.pg);        mTask = new ProgressAsyncTask();        mTask.execute();    }    class ProgressAsyncTask extends AsyncTask {        // 模拟进度更新        @Override        protected Void doInBackground(Void... params) {            for (int i = 0; i < 100; i++) {                publishProgress(i);                try {                    Thread.sleep(300); // 300ms                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return null;        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            // 获取进度更新值            mProgressBar.setProgress(values[0]);    // 当前进度值        }    }}

3-2 如何取消AsyncTask

AsyncTask 底层通过线程池去实现;必须等到前面的线程全部执行完,才能执行当前线程;

让 AsyncTask 生命周期与 Activity 的生命周期保持一致;

public class ProgressBarTest extends Activity {    private ProgressBar mProgressBar;    private ProgressAsyncTask mTask;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.progressbar);        mProgressBar = (ProgressBar) findViewById(R.id.pg);        mTask = new ProgressAsyncTask();        mTask.execute();    }    @Override    protected void onPause() {        super.onPause();        if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){            // cancel方法只是将对应的AsyncTask,标记为cancel状态,并不是真正取消线程执行;            // java中没办法粗暴的停止一个线程,必须等处理完之后;            mTask.cancel(true);        }    }    class ProgressAsyncTask extends AsyncTask {        // 模拟进度更新        @Override        protected Void doInBackground(Void... params) {            for (int i = 0; i < 100; i++) {                if (isCancelled()){                    break;                }                publishProgress(i);                try {                    Thread.sleep(300); // 300ms                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return null;        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            if (isCancelled()) {                return;            }            // 获取进度更新值            mProgressBar.setProgress(values[0]);    // 当前进度值        }    }}

第4章 总结

4-1 总结

  • AsyncTask注意事项

必须在UI线程中创建AsyncTask的实例。
必须在UI线程中调用AsyncTask的execute()方法。
重写的四个方法是系统自动调用的,不应手动调用。
每个AsyncTask只能被执行一次,多次调用将会引发异常。

在doInBackground不能更新UI;
在onPostExecute、onProgressUpdate中可以更新UI;

更多相关文章

  1. android 几个工具方法
  2. Android 判断当前设备是手机还是平板的最有效的方法
  3. Android创建Alert框的方法
  4. Android studio 学习1:实现点击事件的4种方法
  5. 解决方法:android 6.0(api 23) SDK,不再提供org.apache.http.*(只
  6. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操
  7. 【Android笔记】Activity涉及界面全屏的方法
  8. Android Studio查看源码时出现Sources for ‘Android API 30 Pla

随机推荐

  1. MEMCACHED缓存及状态查看
  2. CentOS7.2 通过nfs设置共享文件夹
  3. wget在linux中安装出现错误解决办法
  4. linux下编译 出现 cc1: warnings being t
  5. 如何安装linux系统
  6. windows(win8)和linux(CentOS6)上的telne
  7. Linux中iptables基础命令
  8. linux权限不够,sh不能用
  9. Linux下objdump查看C程序编译后的汇编代
  10. LINUX内核PCI扫描过程