AsyncTask 之怎样使用

异步观感:

            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()可以提醒用户后台工作所完成的进度,例如更新ProgressBar或继续播放动画。 onProgressUpdate()方法将接受第二种数据类型的vararg,也就是doInBackground()通过onProgressUpdate()发布的数据。
 
 
主Activtiy:
 
  1. public class MainActivity extends Activity {
  2.        //声明一个ListView,以取到layout文件下的main.xml里的ListView
  3.        private ListView view;
  4.        @Override
  5.        protected void onCreate(Bundle savedInstanceState) {
  6.        super.onCreate(savedInstanceState);
  7.        setContentView(R.layout.main);
  8.        //取得ListeView
  9.        view = (ListView) findViewById(R.id.listView1);
  10.        //因为是使用到了ListView,所以要用到ArrayAdapter。这个过程也可以放到AsyncTask内使用。ArrayAdapter不会使用的可以百度下
  11.        //这里我就不多说了,不会的也可以问下我,我会留下我QQ,大家一起学习
  12.        //第二个参数是一个布局文件,是用来要显示你数据的,我这个布局很简单,就一个TextView.
  13.        ArrayAdapter<String> arr = new ArrayAdapter<String>(this, R.layout.textview,new ArrayList());
  14.                 
  15.       //在AsyncTask这个类内我覆写了它的构造函数,并构造了三个参数,第一个是ListeView类型,第二个是数据,第三个是ArrayAdapter
  16.        Asynctask text = new Asynctask(view, items, arr);
  17.       //启动AsyncTask
  18.       text.execute();
  19.       Log.i("myinfo", "这里是主UI线程");
  20.      }
  21.      @Override
  22.      public boolean onCreateOptionsMenu(Menu menu) {
  23.      // Inflate the menu; this adds items to the action bar if it is present.
  24.      getMenuInflater().inflate(R.menu.main, menu);
  25.      return true;
  26.      }
  27. }
复制代码
 
 
Asynctask.java:

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

我的QQ:452296864,欢迎各路英雄一起进步,本人也是刚学android两个星期。
posted @ 2013-08-01 10:06  天宇下  阅读(147)  评论(0)    收藏  举报