异步观感:
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>
复制代码
|