Android1.5开始引入了AsyncTask类。实现了简单的异步线程。使得我们可以在后台进程中做一些耗时的工作,并可调用
publishProgress来更新主线程中的UI。
以下是一个简单的例子。
一、Activity
新建Android project。Android SDK版本1.5以上。程序只有一个Activity。
布局文件很简单,就一个TextView,就不贴xml代码了,直接看java代码:
public class main extends Activity {
private
TextView tv;
private MyTask
task;
/** Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// TextView:显示进度
tv = (TextView)
findViewById(R.id.tv_progress);
// 实例化AsyncTask线程
task=new MyTask();
// 启动AsyncTask线程
task.execute(tv);
}
}
二、AsyncTask类
关键是MyTask的代码:
public class MyTask extends AsyncTask<Object,
Integer, Integer> {
private
TextView tv;
// 继承AsyncTask类,覆盖以下5个方法
@Override
protected
void onPreExecute() {
super.onPreExecute();
}
@Override
protected
Integer doInBackground(Object... params) {
tv = (TextView) params[0];
int i;
// 循环100次,每次休眠0.5秒
for (i = 1; i <= 20; i++) {
publishProgress(i);
try {
Thread.sleep(500);
} catch
(InterruptedException e) {
e.printStackTrace();
}
}
return i;
}
@Override
protected
void onProgressUpdate(Integer... progress) {
int i=progress[0];
switch(i%6){
case 1:
tv.setText("等待服务器响应:
." );
break;
case 2:
tv.setText("等待服务器响应:
. ." );
break;
case 3:
tv.setText("等待服务器响应:
. . ." );
break;
case 4:
tv.setText("等待服务器响应:
. . . ." );
break;
case 5:
tv.setText("等待服务器响应:
. . . . ." );
break;
case 0:
tv.setText("等待服务器响应:
. . . . . ." );
break;
}
}
@Override
protected
void onPostExecute(Integer result) {
tv.setText("完成。");
}
@Override
protected
void onCancelled() {
super.onCancelled();
}
}
MyTask类的声明很奇怪,使用了3个范型:Object,Integer,Integer。
第1个范型指定了 doInBackground方法的参数类型是一个不定长的Object数组。
我们这样定义是因为,当主线程中用execute方法启动MyTask线程时,我们会传递一些参数给doInBackground方法。虽然这个例子里我实际只传递了一个TextView参数(用于在Task中更新文字标签的内容)。但作为扩展,我在未来还想传递另一个参数,比如url(类型为java.net.URL),这样,我只好把第1个范型指定为层次比抽象的Object类型了。
第2个范型指定了 onProgressUpdate方法的参数类型为Integer不定长数组。因为这个方法只会在调用
publishProgress 方法时调用,而我们只在 doInBackground方法中调用过 publishProgress方法。我们只需传递一个表示进度的整数给它就可以了。
第3个范型指定了 onPostExecute方法的参数类型。同样,使用Integer类型就可以了。
上面提到的3个方法是AsyncTask的核心方法。
doInBackground方法在线程被execute启动时调用(只有一次)。在该方法中,建立线程循环以完成某些工作。在每次循环完成时,我们通过手动调用publishProgress方法,通知onProgressUpdate方法更新主线程的UI(调用多次)。当所有循环完成后,线程循环结束,自动调用onPostExecute方法返回结果(调用一次),线程销毁。
从上可知,除execute和publishProgress方法外的其他方法
,我们都不应该直接调用。
分享到:
相关推荐
Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper
AsyncTask使用实例以及仿AsyncTask了解其实现原理
Android最全最简单的异步任务AsyncTask使用解析.一步到位彻底理解异步任务。
通过一个ProgressBar来介绍AsyncTask使用实例(含有介绍)
Android_AsyncTask 关于AsyncTask 的一些常见应用。
Android API 3时引进了AsyncTask,也叫异步任务。使用它可以很方便的更新主线程中的UI,使用它比Handler、Thread更简单。由于AsyncTask是抽象类,要使用它首先要创建子类继承它。创建子类时需要三个泛型参数
Android开发之AsyncTask机制及使用细节例子源码 详见博客 http://www.cnblogs.com/samy/p/4217263.html
AsyncTask android 异步 实例
里面是Android AsyncTask 的两种使用方法,一种是加载网络图片,一种是模拟耗时加载进度条
主要介绍了Android中异步类AsyncTask用法,分析总结了Async Task类的功能、特点及相关的使用技巧与注意事项,需要的朋友可以参考下
主要为大家详细解析了Android AsyncTask使用以及源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度
AsyncTask等待任务超过128会出现异常
asyncTask的简单使用,初学者可以很快的入手asyncTask的使用
这个demo主要讲解了AsyncTask的基本使用,希望可以帮助需要的同学.
使用AsyncTask实现异步操作,本案例一从网络上获得图片为例
AsyncTask的用法
根据慕课网视频实现AsyncTask 的使用,其中包括从网络上获取图片以及进度条更新两个Demo
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...