织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

Android中AsyncTask的使用总结

落鹤生 发布于 2012-06-09 01:19 点击:次 
doInBackground 方法在线程被execute启动时调用(只有一次)。在该方法中,建立线程循环以完成某些工作。在每次循环完成时,我们通过手动调用 publishProgress方法,通知onProgressUpdate方法更新主线程的UI(调用多次)。
TAG:

Android1.5开始引入了AsyncTask类。实现了简单的异步线程。使得我们可以在后台进程中做一些耗时的工作,并可调用 publishProgress来更新主线程中的UI。

以下是一个简单的例子。

一、Activity

新建Android project。Android SDK版本1.5以上。程序只有一个Activity。

布局文件很简单,就一个TextView,就不贴xml代码了,直接看java代码:

  1. public class main extends Activity { 
  2. private TextView tv; 
  3. private MyTask task; 
  4.     /** Called when the activity is first created. */ 
  5.     @Override 
  6.     public void onCreate(Bundle savedInstanceState) { 
  7.         super.onCreate(savedInstanceState); 
  8.         setContentView(R.layout.main); 
  9.         // TextView:显示进度 
  10.         tv = (TextView) findViewById(R.id.tv_progress); 
  11.         // 实例化AsyncTask线程 
  12.         task=new MyTask(); 
  13.         // 启动AsyncTask线程 
  14.         task.execute(tv); 
  15.     }    

二、AsyncTask类

关键是MyTask的代码:

  1. public class MyTask extends AsyncTask<object, integer,="" integer=""> { 
  2. private TextView tv; 
  3. // 继承AsyncTask类,覆盖以下5个方法 
  4. @Override 
  5. protected void onPreExecute() { 
  6. super.onPreExecute(); 
  7. @Override 
  8. protected Integer doInBackground(Object... params) { 
  9. tv = (TextView) params[0]; 
  10. int i; 
  11. // 循环100次,每次休眠0.5秒 
  12. for (i = 1; i <= 20; i++) { 
  13. publishProgress(i); 
  14. try { 
  15. Thread.sleep(500); 
  16. catch (InterruptedException e) { 
  17. e.printStackTrace(); 
  18. return i; 
  19.   
  20. @Override 
  21. protected void onProgressUpdate(Integer... progress) { 
  22. int i=progress[0]; 
  23. switch(i%6){ 
  24. case 1
  25. tv.setText("等待服务器响应: ." ); 
  26. break
  27. case 2
  28. tv.setText("等待服务器响应: . ." ); 
  29. break
  30. case 3
  31. tv.setText("等待服务器响应: . . ." ); 
  32. break
  33. case 4
  34. tv.setText("等待服务器响应: . . . ." ); 
  35. break
  36. case 5
  37. tv.setText("等待服务器响应: . . . . ." ); 
  38. break
  39. case 0
  40. tv.setText("等待服务器响应: . . . . . ." ); 
  41. break
  42.   
  43. @Override 
  44. protected void onPostExecute(Integer result) { 
  45. tv.setText("完成。"); 
  46.   
  47. @Override 
  48. protected void onCancelled() { 
  49. 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方法外的其他方法 ,我们都不应该直接调用。

 

 

 

(kmyhy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201206/16076.html]
本文出处:CSDN博客 作者:kmyhy 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容