异步观感:
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:
- public class MainActivity extends Activity {
- //声明一个ListView,以取到layout文件下的main.xml里的ListView
- private ListView view;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //取得ListeView
- view = (ListView) findViewById(R.id.listView1);
- //因为是使用到了ListView,所以要用到ArrayAdapter。这个过程也可以放到AsyncTask内使用。ArrayAdapter不会使用的可以百度下
- //这里我就不多说了,不会的也可以问下我,我会留下我QQ,大家一起学习
- //第二个参数是一个布局文件,是用来要显示你数据的,我这个布局很简单,就一个TextView.
- ArrayAdapter<String> arr = new ArrayAdapter<String>(this, R.layout.textview,new ArrayList());
-
- //在AsyncTask这个类内我覆写了它的构造函数,并构造了三个参数,第一个是ListeView类型,第二个是数据,第三个是ArrayAdapter
- Asynctask text = new Asynctask(view, items, arr);
- //启动AsyncTask
- text.execute();
- Log.i("myinfo", "这里是主UI线程");
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
复制代码
Asynctask.java:
- package com.wwei.asynctask2;
- import android.os.AsyncTask;
- import android.os.SystemClock;
- import android.util.Log;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class Asynctask extends AsyncTask<Void, String, Void>{
- private ListView view;
- private String[] items;
- private ArrayAdapter<String> arr;
-
- int i;
-
- /** 构造函数,传递过来三个参数 **/
- public Asynctask(ListView view,String[] items,ArrayAdapter<String> arr) {
- // TODO Auto-generated constructor stub
- this.view = view;
- this.items = items;
- this.arr = arr;
- }
-
- @Override
- protected void onPreExecute() {
- // TODO Auto-generated method stub
- //这里是一启动AsyncTask就会做的事,你可以在这里做一些布局的布置啊,数据的初始化啊之类的
- //这个做完后就会去到doInBackground()里
- }
- @Override
- protected Void doInBackground(Void... params) {
- // TODO Auto-generated method stub
- Log.i("myinfo", "第一次进入doInBackground");
- for (String item : items) {
- //把items内的数据一个一个取出来,取出一个就调用 publishProgress()这个方法,这个方法启动的话会触发onProgressUpdate()这个方法
- Log.i("myinfo", "这里是doInBackground" + item.toString());
- publishProgress(item);
-
- //回到这里,休息2秒后再执行
- SystemClock.sleep(2000);
- Log.i("myinfo", "第" + i++ +"次" );
- }
-
- Log.i("myinfo", "退出了doInBackground");
-
- return null;
- }
- @Override
- protected void onProgressUpdate(String... values) {
- // TODO Auto-generated method stub
- Log.i("myinfo", "这里是onProgressUpdate" + values[0].toString());
-
- //这里把数据拿出来并加到ArrayAdapter里,这里数组下标只能为0,因为只有一个数据。
- arr.add(values[0]);
-
- //把数据加到ListView中,然后又回到doInBackground(),回去
- view.setAdapter(arr);
- Log.i("myinfo", "出onProgressUpdate啦");
- }
- }
复制代码
main.xml文件
这个很简单,就是设置了一个ListeView,然后设置了下划线.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <ListView
- android:id="@+id/listView1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:divider="#008800"
- android:dividerHeight="2dp" >
- </ListView>
- </LinearLayout>
复制代码
欢迎拍砖
我的QQ:452296864,欢迎各路英雄一起进步,本人也是刚学android两个星期。
|