android AsyncTask异步任务(笔记)

AsyncTask是一个专门用来处理后台进程与UI线程的工具。通过AsyncTask,我们可以非常方便的进行后台线程和UI线程之间的交流。

那么AsyncTask是如何工作的哪。

AsyncTask拥有3个重要参数

1、Params 

2、Progress

3、Result

Params是后台线程所需的参数。在后台线程进行作业的时候,他需要外界为其提供必要的参数,就好像是一个用于下载图片的后台进程,他需要的参数就是图片的下载地址。

Progress是后台线程处理作业的进度。依旧上面的例子说,就是下载图片这个任务完成了多少,是20%还是60%。这个数字是由Progress提供。

Result是后台线程运行的结果,也就是需要提交给UI线程的信息。按照上面的例子来说,就是下载完成的图片。

AsyncTask还拥有4个重要的回调方法。

1、onPreExecute

2、doInBackground

3、onProgressUpdate

4、onPostExecute

onPreExecute运行在UI线程,主要目的是为后台线程的运行做准备。当他运行完成后,他会调用doInBackground方法。

doInBackground运行在后台线程,他用来负责运行任务。他拥有参数Params,并且返回Result。在后台线程的运行当中,为了能够更新作业完成的进度,需要在doInbackground方法中调用PublishProgress方法。该方法拥有参数Progress。通过该方法可以更新Progress的数据。然后当调用完PublishProgress方法,他会调用onProgressUpdate方法用于更新进度。

onProgressUpdate运行在UI线程,主要目的是用来更新UI线程中显示进度的UI控件。他拥有Progress参数。在doInBackground中调用PublishProgress之后,就会自动调onProgressUpdate方法

onPostExecute运行在UI线程,当doInBackground方法运行完后,他会调用onPostExecute方法,并传入Result。在onPostExecute方法中,就可以将Result更新到UI控件上。

明白了上面的3个参数和4个方法,你要做的就是

1、编写一个继承AsyncTask的类,并声明3个参数的类型,编写4个回调方法的内容。

2、然后在UI线程中创建该类(必须在UI线程中创建)。

3、最后调用AsyncTask的execute方法,传入Parmas参数(同样必须在UI线程中调用)。

这样就大功告成了。

另外值得注意的2点就是,千万不要直接调用那四个回调方法。还有就是一个AsyncTask实例只能执行一次,否则就出错哦。

以上是AsyncTask的基本用法,更加详细的内容请参考android官方文档。最后附上一段代码,供大家参考。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 
 2 //在这里声明了Params、Progress、Result参数的类型
 3 {
 4     //因为这里不需要使用onPreExecute回调方法,所以就没有加入该方法
 5     
 6     //后台线程的目的是更具URL下载数据
 7      protected Long doInBackground(URL... urls) {
 8          int count = urls.length;//urls是数组,不止一个下载链接
 9          long totalSize = 0;//下载的数据
10          for (int i = 0; i < count; i++) {
11              //Download是用于下载的一个类,和AsyncTask无关,大家可以忽略他的实现
12              totalSize += Downloader.downloadFile(urls[i]);
13              publishProgress((int) ((i / (float) count) * 100));//更新下载的进度
14              // Escape early if cancel() is called
15              if (isCancelled()) break;
16          }
17          return totalSize;
18      }
19 
20      //更新下载进度
21      protected void onProgressUpdate(Integer... progress) {
22          setProgressPercent(progress[0]);
23      }
24 
25      //将下载的数据更新到UI线程
26      protected void onPostExecute(Long result) {
27          showDialog("Downloaded " + result + " bytes");
28      }
29  }
30

有了上面的这个类,接下你要做的就是在UI线程中创建实例,并调用execute方法,传入URL参数就可以了。  

posted @ 2017-05-18 14:22  第101次弃游  Views(198)  Comments(0Edit  收藏  举报