Andorid编程心得-Android中AsyncTask的使用
2013-04-22 13:49
225 查看
在Android的应用开发中,经常会遇到后台异步执行一些事情,这时我们就需要使用多线程来进行操作,将比较耗时的操作放在单独的线程执行,因此Android为了降低开发难度,提供了AsyncTask。AsyncTask是一个封装过的后台任务类,也就是异步任务。
AsyncTask直接继承于Object类,位于android.os.AsyncTask。要使用AsyncTask需要我们提供三个泛型参数,并且要重载几个方法(但至少要重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
1. Params:启动任务执行时传入参数的数据类型
2. Progress:后台任务执行时更新UI数据类型
3. Result:后台执行任务后最终返回结果的数据类型
具体参数格式如下:
AsyncTask<[Input Parameter Type], [Progress Report Type], [Result Type]>
如果不需要传入参数、更新UI数据或者返回值时,只需简单的指定相应的类型为Void。
执行一个AsyncTask的步骤如下:
1. 继承AsyncTask类
2. 实现AsyncTask类中定义的一个或几个方法:
onPreExecute():该方法在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,比如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现
doInBackground(Params...):该方法在onPreExecute 方法执行后马上执行,运行在后台线程中。比较耗时的操作都可以放在这里。要注意这里不能直接操作UI。在执行过程中可以调用publicProgress(Progress…)方法来更新实时的任务进度。该方法是抽象方法,子类必须实现
onProgressUpdate(Progress...):该方法在publishProgress方法被调用后执行,UI 线程将调用这个方法在界面上展示任务的进展情况,可以通过一个进度条进行展示等
onPostExecute(Result):该方法在doInBackground 方法执行完成后,将被UI 线程调用,后台任务执行的结果将通过该方法传递给UI 线程,在界面上展示给用户看等
onCancelled():用户调用取消时要做的操作
还有使用AsyncTask类,必须遵守以下几条准则:
1. 异步任务类的实例必须在UI线程中创建
2. Execute方法必须在UI线程中调用
3. 不要手动的调用onPreExecute(),doInBackground(Params...),onProgressUpdate(Progress...),onPostExecute(Result)这几个方法
4. 该实例只能被执行一次,多次调用时会出现异常情况
下面是使用AsyncTask类的一个例子:
public void setViewImage(ImageView v, String value) {
new ImageDownloadTask().execute(value, v);
}
private class ImageDownloadTask extends AsyncTask<Object, Object, Bitmap>{
private ImageView imageView = null;
@Override
protected Bitmap doInBackground(Object... params) {
Bitmap bmp = null;
imageView = (ImageView) params[1];
bmp = WebImageBuilder.returnBitMap((String)params[0], ctx);
return bmp;
}
@Override
protected void onPostExecute(Bitmap result){
if(result != null) {
imageView.setImageBitmap(result);
} else {
imageView.setImageBitmap(BitmapFactory.decodeResource(ctx.getResources(),
R.drawable.defaultimage));
}
}
}
注意:doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定数据类型,第三个为doInBackground返回和onPostExecute传入参数的数据类型
在Android中,AsyncTask与Handler相比较,AsyncTask更轻量级一些,适用于简单的异步处理。AsyncTask和Handler,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,所以异步处理是不可避免的。AsyncTask使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler即可实现。
AsyncTask类提供了一种既简单又方便的途径就可以将你的耗时操作移到后台线程进行,与UI线程异步同步的处理程序可以让你方便的在任务完成后更新Views控件和其他的UI元素的结果。
AsyncTask处理着所有线程的创建、管理和异步刷新,使你能够创建一个异步同步任务在操作完成后维护后台操作和UI更新处理的一致性。
但AsyncTask在使用多个异步操作,并需要进行UI更新时,就会变得复杂起来。对于多个后台任务执行时,Handler就比较适合。
AsyncTask直接继承于Object类,位于android.os.AsyncTask。要使用AsyncTask需要我们提供三个泛型参数,并且要重载几个方法(但至少要重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
1. Params:启动任务执行时传入参数的数据类型
2. Progress:后台任务执行时更新UI数据类型
3. Result:后台执行任务后最终返回结果的数据类型
具体参数格式如下:
AsyncTask<[Input Parameter Type], [Progress Report Type], [Result Type]>
如果不需要传入参数、更新UI数据或者返回值时,只需简单的指定相应的类型为Void。
执行一个AsyncTask的步骤如下:
1. 继承AsyncTask类
2. 实现AsyncTask类中定义的一个或几个方法:
onPreExecute():该方法在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,比如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现
doInBackground(Params...):该方法在onPreExecute 方法执行后马上执行,运行在后台线程中。比较耗时的操作都可以放在这里。要注意这里不能直接操作UI。在执行过程中可以调用publicProgress(Progress…)方法来更新实时的任务进度。该方法是抽象方法,子类必须实现
onProgressUpdate(Progress...):该方法在publishProgress方法被调用后执行,UI 线程将调用这个方法在界面上展示任务的进展情况,可以通过一个进度条进行展示等
onPostExecute(Result):该方法在doInBackground 方法执行完成后,将被UI 线程调用,后台任务执行的结果将通过该方法传递给UI 线程,在界面上展示给用户看等
onCancelled():用户调用取消时要做的操作
还有使用AsyncTask类,必须遵守以下几条准则:
1. 异步任务类的实例必须在UI线程中创建
2. Execute方法必须在UI线程中调用
3. 不要手动的调用onPreExecute(),doInBackground(Params...),onProgressUpdate(Progress...),onPostExecute(Result)这几个方法
4. 该实例只能被执行一次,多次调用时会出现异常情况
下面是使用AsyncTask类的一个例子:
public void setViewImage(ImageView v, String value) {
new ImageDownloadTask().execute(value, v);
}
private class ImageDownloadTask extends AsyncTask<Object, Object, Bitmap>{
private ImageView imageView = null;
@Override
protected Bitmap doInBackground(Object... params) {
Bitmap bmp = null;
imageView = (ImageView) params[1];
bmp = WebImageBuilder.returnBitMap((String)params[0], ctx);
return bmp;
}
@Override
protected void onPostExecute(Bitmap result){
if(result != null) {
imageView.setImageBitmap(result);
} else {
imageView.setImageBitmap(BitmapFactory.decodeResource(ctx.getResources(),
R.drawable.defaultimage));
}
}
}
注意:doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定数据类型,第三个为doInBackground返回和onPostExecute传入参数的数据类型
在Android中,AsyncTask与Handler相比较,AsyncTask更轻量级一些,适用于简单的异步处理。AsyncTask和Handler,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,所以异步处理是不可避免的。AsyncTask使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler即可实现。
AsyncTask类提供了一种既简单又方便的途径就可以将你的耗时操作移到后台线程进行,与UI线程异步同步的处理程序可以让你方便的在任务完成后更新Views控件和其他的UI元素的结果。
AsyncTask处理着所有线程的创建、管理和异步刷新,使你能够创建一个异步同步任务在操作完成后维护后台操作和UI更新处理的一致性。
但AsyncTask在使用多个异步操作,并需要进行UI更新时,就会变得复杂起来。对于多个后台任务执行时,Handler就比较适合。
相关文章推荐
- android多线程 异步请求 AsyncTask使用心得
- Android AsyncTask完全解析FutureTask 深度解析 -Java并发编程:Callable、Future和FutureTask一个使用DownloadManager下载文件的小例
- Android AsyncTask使用心得及错误处理-只能在主线程改变UI组件
- Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果
- Android 中的AsyncTask的简单使用心得
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
- Andorid编程心得-利用代码解决Android WIFI休眠后连接断开的问题
- Android编程心得-使用Application类保存应用的全局数据
- Android编程心得---Fragment使用总结(一)
- 编程androidAndroid编程心得-JSON使用心得
- Android编程心得---Fragment使用总结(一)
- Android编程心得-使用Application类保存应用的全局数据
- Android编程心得-JSON使用心得
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- Android编程之Toast官方使用说明译文
- Android_NewBird之Asynctask的基本使用(2)
- Android开发心得-使用File ExPlorer无法访问系统内部文件
- Notes_Android编程path使用
- android AsyncTask简单使用