您的位置:首页 > 其它

使用AsyncTask方法动态加载数据

2013-04-03 05:04 441 查看
1、基础知识

AsyncTask也是android提供的一个为了不能阻塞主线程的一个类,AsyncTask定义了三种泛型类型Params、Progress和Result,Params启动任务执行输入参数,比如http请求的url和参数,Progress后台执行任务的百分比,后台执行最终返回的结果。

AsyncTask的执行分为四个步骤,每一步都对应都对应一个回调方法,开发者需要实现一个或者几个方法,在任务的执行过程中,这些方法会自动调用。

onPreExecute(),在执行后台耗时操作前被调用,可以在执行此方法中做一些ui操作,比如显示一个进度条等

doInBackground(Params...),这个方法在执行onPreExecute()后执行,这个方法完成耗时工作,比如下载等。

onProgressUpdate(Progress...),UI线程通过此方法获取任务的完成的情况,比如完成的任务的百分比。

onPostExecute(Result),这个方法在耗时工作完成后被调用。UI线程调用此方法获取结果。

AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数(如需深入了解原理请看《Android异步处理四:AsyncTask的实现原理》)。

AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。

2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。

3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。

4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。

5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用

AsyncTask的构造函数有三个模板参数:

1.Params,传递给后台任务的参数类型。

2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)

3.Result, 后台执行返回的结果的类型。

AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。

注意:在使用AsyncTask类,有几条准则需要遵守

(1)、Task的实例必须在UI线程中创建

(2)、execute方法必须在UI线程中调用

(3)、不要手动调用以上四个方法

(4)、这个任务只执行一次(如果执行第二次将会抛出异常)

2、主要代码

1 @Override
2     public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
3         // TODO Auto-generated method stub
4         if(arg1+arg2==arg3)
5         {
6             if(!isloading)
7             {
8                 new myAsyncTask().execute(null);
9             }
10             else
11             {
12                 mListView.removeFooterView(loadingLayout);
13             }
14         }
15     }
16
17     @Override
18     public void onScrollStateChanged(AbsListView arg0, int arg1) {
19         // TODO Auto-generated method stub
20
21     }
22
23     private class myAsyncTask extends AsyncTask<Void, Void, Void>
24     {
25
26         @Override
27         protected Void doInBackground(Void... params) {
28             // TODO Auto-generated method stub
29
30             newsList = new ArrayList<News>();
31             newsList = getNewsList();
32             getdata(newsList);
33             return null;
34
35         }
36
37         @Override
38         protected void onPostExecute(Void result) {
39             // TODO Auto-generated method stub
40             super.onPostExecute(result);
41             adapter.count+=size;
42             adapter.notifyDataSetChanged();
43             startIndex+=size;
44             isloading=false;
45         }
46
47         @Override
48         protected void onPreExecute() {
49             // TODO Auto-generated method stub
50             super.onPreExecute();
51             isloading=true;
52         }
53
54     }


注:以上仅是和使用Handler+线程方法不同的代码,建议下载源码,了解详细代码

3、小结

ListView使用AsyncTask方法动态加载数据的方法如下:

1.和handler一样初始化页面(如:加载第一页)

2.在接收某个事件的消息之后(以上代码是onScroll事件),创建一个新的异步任务,并开始执行

3.耗时工作完成后,开始更新UI

三、总结

使用Handler+线程和使用AsyncTask方法进行ListView动态加载的比较

Handler+线程方式:

在使用Handler方式时,它涉及Handler、Thread、Message、Looper四个对象,在执行的流程如下:主线程启动一个Thread,这个Thread执行耗时操作,耗时操作完成后,生成一个Message,Looper读取Message并传递给Hander,Handler接收Message并更新响应的UI。因为Looper在一个message处理完,才会读下一条,如果发生多个Message就会形成一个消息队列,所以它对多个后台操作比较清晰,明朗。但对于单个message来讲显得代码比较多,过于复杂。

AsyncTask方式:

AsyncTask继承自Object,是android提供的轻量级的异步类。并提供了一个方法来获取任务的执行进度(可以根据它来更新UI),最后会把结果返回在主线程。这个方式的比较简单,而且可以清楚的看到耗时任务执行的进度。但是对于多个异步操作同时进行,并更新UI变得比较复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐