异步任务AsyncTask的使用
异步任务类AsyncTask,通俗点说就是可以帮助我们用线程将两段代码不同步的进行,一般的是用来更新UI界面的,(我们知道在子线程中是不能更新UI的,但是在AsyncTask中是可以更新的,不需要将Handler和子线程就可以完成异步操作并且更新UI界面了),当然其他的耗时操作也可以放在里面进行,比如说进行网络的请求或者是数据库的存取之类的...刚接触这个不久,自己也就用过一次,所以对这个不是很熟悉,如果有什么不对的地方还希望各位给小达指出~~~~~,关于异步任务类的内部实现原理,可以参考chenshaoyang0011
由于我是在做一个天气App的过程中接触到的,所以把里面的源码拿过来做实现的例子.异步任务类是一个抽象类,
在继承了这个抽象类之后,直接在UI线程中调用execute()方法就能实现异步了,AsyncTask<Void,Void,Void>里
定义了三种泛型类型,分别是
Params : 在UI线程中实例化继承了异步任务类的类之后,调用execute()时里面放入的参数类型,也就是doInBackground(的 参数类型.这个参数实际上是一个varags,例如String[] , int[] 等等,比如在继承的时候AsyncTask<String,Void,Void>,这样写,那么在doInBackground(String... params)应该对应起来写,实际上这个params应该是一个String类型的数组.
Progress : 该参数是在doInBackground()方法执行过程中,不断的产出的参数,相当于异步任务执行进度,为publishProgress()和onProgressUpdate()的参数类型.这个参数和上面的也也一样,也是类似于String[] 的一个东西.
Result : doInBackground()方法的返回值类型.就只有这个参数稍微正常了点,是String 就是 String .
使用前先自定义一个类继承它,里面有四个函数:
一. doInBackground(Void... params) 这个函数是最主要的,即后台主要运行的代码放在里面,可以执行耗时的方法,其中的参数是可变的,在后面会讲到,这里因为在前面继承AsyncTask的时候是
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void> {
这个样子继承的,所以
doInBackground里面的参数也是Void类型.
二. onPreExecute() 此函数在UI线程中调用execute()后,在doInBackground()方法执行之前运行.通过命名也能看的出来哈.
三. onProgressUpdate(Void... values) 在publishProgress()被调用以后执行,publishProgress()用于更新进度.
四. onPostExecute(Void aVoid) 运行在ui线程中,在doInBackground()执行完毕后执行.
以上就是我们在运用异步任务类的时候会接触到的几个函数了,将我们需要执行的任务分配一下就能达到想要的目的.下面就结合实例来看看异步任务类怎么发挥作用的...
先在MainActivity的OnCreate()方法里面实例化了一个继承了AsyncTask的DatabaseAsyncTask类,直接调用databaseAsyncTask.execute()方法,让其在后台查询数据库中的数据.上代码...
/**
*这部分就是在activity中的两行代码.用起来还是很简单的哈
*/
DatabaseAsyncTask databaseAsyncTask = new DatabaseAsyncTask
(getApplicationContext(),MainActivity.this);
databaseAsyncTask.execute();
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void>{
private Context context;
private Activity activity;
public DatabaseAsyncTask(Context context,Activity activity) {
this.activity = activity;
this.context = context;
}
/**
* 在doInBackground之前执行
*/
@Override
protected void <span style="color:#ff0000;">onPreExecute</span>() {
super.onPreExecute();
}
/**
* 运行在ui线程中,在doInBackground()执行完毕后执行
*/
@Override
protected void <span style="color:#ff0000;">onPostExecute</span>(Void aVoid) {
super.onPostExecute(aVoid);
}
/**
* 在publishProgress()被调用以后执行,publishProgress()用于更新进度
*/
@Override
protected void <span style="color:#ff0000;">onProgressUpdate</span>(Void... values) {
super.onProgressUpdate(values);
}
/**
* 后台运行的方法,可以运行非UI线程,可以执行耗时的方法
*/
@Override
protected Void <span style="color:#ff0000;">doInBackground</span>(Void... params) {
ArrayList<String> cityArrayList = MainActivity.cityArrayList;
if(cityArrayList.size() != 0) {
for(String city : cityArrayList) {
SQLiteUtil.ReadData(city);
}
}
return null;
}
}
结合例子讲完之后,再来说说使用AsyncTask的过程中应该注意的事情:
1) 继承异步任务类的类必须在UI线程中实例化
2) execute()方法也要在UI线程中调用
3) 不要手动的去调用前面说到的那四个函数咯,AsyncTask已经帮我们封装好了线程等东西,手动调用的话就相当于我们new了一个新的线程,直接调用其run()方法一样,会达到异步任务的效果么0.0,不过也可以手动调用的玩玩看~~~~
4) doInBackground()方法中返回值就是onPostExecute()方法(在doInBackground方法执行后执行在UI线程中)传入的参数,需要对应.
5) 实例化之后AsyncTask只能被执行一次,多次调用会出现异常情况的.还是演示下把,看图~~~~
今天的异步任务就到这里咯,我已经把我所有知道的东西都写出来了,各位有好的建议和意见都可以Q我2319821734或者直接给我留言的~~~~
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)