异步观感:


            AsyncTask是一个小型的线程。在UI线程中一些耗时的操作可以交个新的线程去处理,如Thread,Runable。这里我们是用AsyncTask。


要实现的效果:


           在主Activity把一个数组数据放到后台处理,然后各1秒就从后台加载一个数据到主 Activity的ListView上。


如何使用:

          1、创建一个类并继承AsyncTask类。

          public class Asynctask extends AsyncTask<Void, String, Void>


         Asynctask  使用泛型,所以需要指定3种数据类型

         1、处理任务所需的信息类型

         2、任务间传递的用于指示进度信息类型

         3、任务完成时传递到任务后代码的信息类型

 

 AsyncTask中可以覆写4中方法来完成工作

 

         对于一个很有用的任务类,一个必须要覆写的方法是doInBacakground()。doInBacakground()方法将接受第一种数据类型的Vararg数组作为参数。这个参数是处理任务所需的数据。

         所以,如果一个任务的目标是下载一个URL集合,doInBacakground()将接收这些URL供处理。doInBacakground()方法一定会返回第三种类型的值---后台工作的结果。

 

         onPreExecute(),在后台线程执行doInBacakground()之前,会从UI线程调用onPreExecute()。

 

         onPostExecute(),在doInBackground()完成之后会从UI线程调用此方法。

 

         onProgressUpdate(),如果doInBackground()调用了任务的publishProgress()方法,那么传递给该方法的对象将提供给UI线程中的onProgressUpdate()。

 onProgressUpdate()方法将接受第二种数据类型的vararg,也就是doInBackground()通过onProgressUpdate()发布的数据。

 

 

主Activtiy:

 




1. public class MainActivity extends Activity {
2.        //声明一个ListView,以取到layout文件下的main.xml里的ListView
3. 
4.        private ListView view;
5. 
6. 
7.        @Override
8. 
9.        protected void onCreate(Bundle savedInstanceState) {
10. 
11.        super.onCreate(savedInstanceState);
12. 
13.        setContentView(R.layout.main);
14. 
15.        //取得ListeView
16. 
17.        view = (ListView) findViewById(R.id.listView1);
18. 
19. 
20. 
21.        //因为是使用到了ListView,所以要用到ArrayAdapter。这个过程也可以放到AsyncTask内使用。ArrayAdapter不会使用的可以百度下
22. 
23.        //这里我就不多说了,不会的也可以问下我,我会留下我QQ,大家一起学习
24. 
25.        //第二个参数是一个布局文件,是用来要显示你数据的,我这个布局很简单,就一个TextView.
26. 
27.        ArrayAdapter<String> arr = new ArrayAdapter<String>(this, R.layout.textview,new ArrayList());
28. 
29.  
30.       //在AsyncTask这个类内我覆写了它的构造函数,并构造了三个参数,第一个是ListeView类型,第二个是数据,第三个是ArrayAdapter
31. 
32.        Asynctask text = new Asynctask(view, items, arr);
33. 
34. 
35. 
36.       //启动AsyncTask
37. 
38.       text.execute();
39. 
40. 
41. 
42.       Log.i("myinfo", "这里是主UI线程");
43. 
44.      }
45. 
46. 
47.      @Override
48. 
49.      public boolean onCreateOptionsMenu(Menu menu) {
50. 
51.      // Inflate the menu; this adds items to the action bar if it is present.
52. 
53.      getMenuInflater().inflate(R.menu.main, menu);
54. 
55.      return true;
56. 
57.      }
58. 
59. 
60. }

复制代码


 
 
Asynctask.java:




1. package com.wwei.asynctask2;
2. 
3. import android.os.AsyncTask;
4. import android.os.SystemClock;
5. import android.util.Log;
6. import android.widget.ArrayAdapter;
7. import android.widget.ListView;
8. 
9. public class Asynctask extends AsyncTask<Void, String, Void>{
10.         private ListView view;
11.         private String[] items;
12.         private ArrayAdapter<String> arr;
13.  
14.         int i;
15.  
16.         /**        构造函数,传递过来三个参数 **/
17.         public Asynctask(ListView view,String[] items,ArrayAdapter<String> arr) {
18.                 // TODO Auto-generated constructor stub
19.                 this.view = view;
20.                 this.items = items;
21.                 this.arr = arr;
22.         }
23.  
24.         @Override
25.         protected void onPreExecute() {
26.                 // TODO Auto-generated method stub
27.                 //这里是一启动AsyncTask就会做的事,你可以在这里做一些布局的布置啊,数据的初始化啊之类的
28.                 //这个做完后就会去到doInBackground()里
29.         }
30. 
31.         @Override
32.         protected Void doInBackground(Void... params) {
33.                 // TODO Auto-generated method stub
34.                 Log.i("myinfo", "第一次进入doInBackground");
35.  
36.                         //把items内的数据一个一个取出来,取出一个就调用 publishProgress()这个方法,这个方法启动的话会触发onProgressUpdate()这个方法
37.                         Log.i("myinfo", "这里是doInBackground" + item.toString());
38.                         publishProgress(item);
39.  
40.                         //回到这里,休息2秒后再执行
41.                         SystemClock.sleep(2000);
42.                         Log.i("myinfo", "第" + i++ +"次" );
43.                 }
44.  
45.                 Log.i("myinfo", "退出了doInBackground");
46.  
47.                 return null;
48.         }
49.         @Override
50.         protected void onProgressUpdate(String... values) {
51.                 // TODO Auto-generated method stub
52.                 Log.i("myinfo", "这里是onProgressUpdate" + values[0].toString());
53.  
54.                 //这里把数据拿出来并加到ArrayAdapter里,这里数组下标只能为0,因为只有一个数据。
55.                 arr.add(values[0]);
56.  
57.                 //把数据加到ListView中,然后又回到doInBackground(),回去
58.                 view.setAdapter(arr);
59.                 Log.i("myinfo", "出onProgressUpdate啦");
60.         }
61. 
62. }


复制代码



 

 

main.xml文件

这个很简单,就是设置了一个ListeView,然后设置了下划线.




1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3.     android:layout_width="match_parent"
4.     android:layout_height="match_parent"
5.     android:orientation="vertical" >
6. 
7.     <ListView
8.         android:id="@+id/listView1"
9.         android:layout_width="match_parent"
10.         android:layout_height="wrap_content"
11.         android:divider="#008800"
12.         android:dividerHeight="2dp" >
13. 
14.     </ListView>
15. 
16. </LinearLayout>


复制代码