(自己的老博客搬运)createdAt:2017-06-13 19:59:16
基本概念
AsyncTask是什么?---异步任务,听起来是用来执行一些比较耗时的操作的。 首先要知道Android的两个概念:主线程(又叫UI线程)和后台线程
- 主线程:是一个Android程序开始运行时默认启动的线程,主要用来显示界面,跟用户交互
- 后台线程:除了主线程以外的线程,加载数据等
所以,为了让用户体验好一点,为了程序能快速响应用户的操作,稍微耗时点的工作最好都不要放在主线程里啦~~那我们要自己创线程吗?并不需要,Android给我们封装了一个类~~就是这个 AsyncTask 啦~
AsyncTask4个主要方法
因为AsyncTask是抽象类,必须要继承、重写关键方法才能用 他们都是回调函数,就是我们负责实现就好,Android负责调用
- onPreExecute
- doInBackground
- onProgressUpdate
- onPostExecute
看名字就能猜出来个大概意思了,只有onProgressUpdate不大好理解,现在逐一解释一下
onPreExecute
这个是最先执行的方法,是在主线程执行的,一般进行一些初始的配置
doInBackground(Params...)
第二个执行的方法,是在后台线程执行的(也是主线程的子线程),用来做耗时操作的主要部分~
onProgressUpdate(Progress...)
这个是给用户反馈进度条用的~,我们可以在doInBackground里随时调用AsyncTask的函数publishProgress,publishProgress函数的内部会调用onProgressUpdate~等下举个例子就清楚啦
onPostExecute(Result)
在doInBackground执行 结束 之后执行,它的参数Result是doInbackground的返回值
注意:除了doInBackground方法,另外3个都是在主线程执行的~
例子来啦
这个源于stackoverflow上一个大神给的例子~ 是一个模拟下载,显示进度百分数的过程
public class AsyncTaskExample extends Fragment {
protected TextView _percentField;
protected InitTask _initTask;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_initTask = new InitTask();
//这样就可以启动这个task啦
_initTask.execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
_percentField = (TextView)rootView.findViewById(R.id.percent_field);
return rootView;
}
/**
解释一下这里的3个参数,这是我们在继承AsyncTask时指定的三个泛型参数,
分别是上面提到的三个回调方法所用的参数
1. Params 在执行AsyncTask时需要传入的参数,即doInBackground的参数
2. Progress 后台任务执行时,在界面上显示当前的进度的类型,即onProgressUpdate的参数
3. Result 当任务执行完毕后,返回结果的类型,即onPostExecute的参数和doInBackground的返回值类型
*/
protected class InitTask extends AsyncTask<Void, Integer, String> {
@Override
protected String doInBackground(Void... params) {
int i = 0;
while (i <= 50) {
try {
Thread.sleep(50);
publishProgress(i);
i++;
}
catch (Exception e) {
Log.i("makemachine", e.getMessage());
}
}
return "COMPLETE!";
}
@Override
protected void onPreExecute() {
Log.i("makemachine", "onPreExecute()");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i("makemachine", "onProgressUpdate(): " + String.valueOf(values[0]));
_percentField.setText((values[0] * 2) + "%");
_percentField.setTextSize(values[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.i("makemachine", "onPostExecute(): " + result);
_percentField.setText(result);
_percentField.setTextColor(0xFF69adea);
}
}
}
总结
以上就是AysncTask的基本用法啦~