首页 > 代码库 > AsyncTask使用解析

AsyncTask使用解析

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。
AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法开始执行异步任务。

Async有三个泛型参数Async<params,inetger,result>:
  • Params是指调用execute()方法时传入的参数类型和doInBackground()的参数类型
  • Progress是指更新进度时传递的参数类型,即publishProgress()和onProgressUpdate()的参数类型
  • Result是指doInBackground()的返回值类型

上面的说明涉及到几个方法:

  • doInBackgound() 这个方法是继承AsyncTask必须要实现的,
    运行于后台,耗时的操作可以在这里做
  • publishProgress() 更新进度,给onProgressUpdate()传递进度参数
  • onProgressUpdate() 在publishProgress()调用完被调用,更新进度

实际的例子:

  1. publicclassMyActivityextendsActivity
  2. {
  3. privateButton btn;
  4. privateTextView tv;
  5. @Override
  6. publicvoid onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. btn =(Button) findViewById(R.id.start_btn);
  11. tv =(TextView) findViewById(R.id.content);
  12. btn.setOnClickListener(newButton.OnClickListener(){
  13. publicvoid onClick(View v){
  14. update();
  15. }
  16. });
  17. }
  18. privatevoid update(){
  19. UpdateTextTask updateTextTask =newUpdateTextTask(this);
  20. updateTextTask.execute();
  21. }
  22. classUpdateTextTaskextendsAsyncTask<Void,Integer,Integer>{
  23. privateContext context;
  24. UpdateTextTask(Context context){
  25. this.context = context;
  26. }
  27. /**
  28. * 运行在UI线程中,在调用doInBackground()之前执行
  29. */
  30. @Override
  31. protectedvoid onPreExecute(){
  32. Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();
  33. }
  34. /**
  35. * 后台运行的方法,可以运行非UI线程,可以执行耗时的方法
  36. */
  37. @Override
  38. protectedInteger doInBackground(Void... params){
  39. int i=0;
  40. while(i<10){
  41. i++;
  42. publishProgress(i);
  43. try{
  44. Thread.sleep(1000);
  45. }catch(InterruptedException e){
  46. }
  47. }
  48. returnnull;
  49. }
  50. /**
  51. * 运行在ui线程中,在doInBackground()执行完毕后执行
  52. */
  53. @Override
  54. protectedvoid onPostExecute(Integer integer){
  55. Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();
  56. }
  57. /**
  58. * 在publishProgress()被调用以后执行,publishProgress()用于更新进度
  59. */
  60. @Override
  61. protectedvoid onProgressUpdate(Integer... values){
  62. tv.setText(""+values[0]);
  63. }
  64. }
  65. }



来自为知笔记(Wiz)



AsyncTask使用解析