Android--AnsyncTask异步任务

AnsyncTask类是Android的一个轻量级的用于处理异步任务的类,一般用法是继承AsyncTask类,然后在类中实现异步操作,再将异步执行的进度反映在主线程的UI组件上,也可以直接new一个新的AsyncTask的对象,重写里面的对应方法。关于AsyncTask异步任务的讲解网上很详细,这里自己也总结一下。

相关概念

多线程概念

  • 线程(Thread):程序执行流的最小单元,是程序中一个单一的顺序控制流程,每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
  • 多线程(multithreading):并行地执行多条指令,将CPU的时间片按照调度算法,分配给各个线程,实际上是分时执行的,因为切换时间很短,让人感觉是同时实行!

同步与异步

  • 同步:比如当我们做某件事情时,在没完成之前就不能做其他事情,简单说就是必须等前一件事做完才能做下一件事。对于程序而言,上一条语句没执行完就不能执行下一条语句。
  • 异步:当我们执行某个功能后,我们并不需要立即得到结果,我们额可以正常地做其他操作,这个功能可以在完成后通知或者回调来告诉我们

AsyncTask解析

使用AsyncTask的必要性

  • 由于Android是不允许一般线程中更新UI组件,另外Android4.0后禁止在UI线程中执行网络操作。这时候就需要异步操作,通常我们在Handler里写好UI更新,然后通过sendMessage()等的方法通知UI更新,但是Handler相较于AsyncTask是重量级的,AsyncTask轻量级异步类我们通过几十行的代码就可以完成 我们的异步操作,而且进度可控,实际异步用的最多的地方就是网络操作,图片加载,数据传输等

AsyncTask的结构

AsyncTask子类的参数

1
2
3
4
5
6
AsyncTask<Params, Progress, Result>		
//Params:启动任务执行的输入参数
//Progress:后台任务执行的百分比
//Result:后台执行任务完成后返回的结果
//不需要的指令类型可以写成Void(大写V)
//注意:参数都是泛型

AsyncTask相关方法与流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
AsyncTask<Void, String, Void> test = new AsyncTask<Void, String, Void>(){
@Override
protected void onPreExecute() { //**非必要
//** 在执行后台耗时操作前被调用,通常用于一些初始化操作
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... arg0) { //**必要
//** 1.在onPreExecute()方法执行后马上执行,该方法运行与后台中,主要负责执行耗时操作;
//** 2.通过调用publishProgress(String values)更新任务进度
//** 3.publishProgress(String values)方法是可以多次调用的,每次调用到跳转到onProgressUpdate(String values)方法里面处理
return null;
}

@Override
protected void onPostExecute(Void result) { //**必要
//** doInBackground执行完毕后,onPostExecute方法奖被UI线程调用,后台结果将在UI组件显示
super.onPostExecute(result);
}

@Override
protected void onProgressUpdate(String... values) { //**非必要
//** 1.参数values[0]就是 publishProgress(String values)方法传入的
//** 2.可在此方法中更新UI控件,常用的是进度条
super.onProgressUpdate(values);
}

@Override
protected void onCancelled() { //**非必要
// 在用户取消线程操作是调用
super.onCancelled();
}

@Override
protected void onCancelled(Void result) { //**非必要
// TODO Auto-generated method stub
super.onCancelled(result);
}
};

使用注意

1.AsyncTask的实例以及execute()方法必须在UI线程中创建
2.不要手动调用AsyncTask的实例里面重写的方法
3.AsyncTask的实例只能被执行一次,多次调用会出现异常

结束