AsyncTask实现多线程 (简要分析)
2011-09-10 13:05
302 查看
首先,从名字上看AsyncTask 全称 synchronious task 汉语意思可以理解为异步任务。它可以实现一个后台线程,并且可以将结果上交到UI线程。定义一个AsyncTask需要三个属性,它们分别是Params、Progress、Result。这三个属性我们会在下面讲解。除此以外,当一个asynchronous task执行后,将会经过4个步骤,即四个回调函数的调用。
下面我们给出一个AsyncTask的例子,这个例子来源于Android SDK,有兴趣的可以自己去看看。
AsyncTask子类的实现:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + "
bytes");
}
}
在UI线程中的执行上面定义的AsyncTask的子类DownFilesTask
new DownloadFilesTask().execute(url1, url2, url3);
现在让我们结合着开始的文字来了解AsyncTask
在上面类的定义中有这样一句话:private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
这里的URL,Integer,Long便对应着所说过的Params,Progress, Result。这三个属性到底有什么用呢?我们暂时把它放一下,接着来看那四个步骤。
四个步骤,即四个回调函数,它们分别是:
onPreExecute()
由UI线程在Task执行后紧接着调用.。一般用来进行一些初始化操作。
doInBackground(Params...)
由后台进程在onPreExecute()执行完毕后调用.。这个便是处理那些耗时操作的地方了。在该函数中,你可以手动调用publishProgress(Progress...)
来向主线程传递程序的执行进度。而这个publishProgress(Progress...)实质上是将参数传递给了onProgressUpdate(Progress),通过这个方法实现向UI线程上交信息。
onPostExecute(Result...) 由UI线程在后台操作执行完成后调用,它的参数便是由doInBackground(Params...)返回的值。
现在我们已经大体的了解了AsyncTask的机制。
大家可以结合着代码来理解,最好是亲自去看看Android SDK,它是任何参考书都比不上的。
最重要一点一个AsynTask只能使用一次,且只能在UI线程中实例化。
根据我的学习经历,我希望还不太了解同学可以尝试去搞懂以下两个问题:
1、三个属性在四个步骤中的分别的位置和作用(在哪个函数里,是函数的形参还是返回值)。
2、在UI线程中执行AsyncTask时传入的参数对应哪个属性,去了哪里,如何在接收到它的函数中使用。
更加详细的分析我会在不久找时间贴出来。
由于本人也是菜鸟一个,对android理解不深,难免会出现各种理解上的错误,希望大家给予指正!!
最好的学习是要自己去找寻思路,而不是只走在别人的路上。
下面我们给出一个AsyncTask的例子,这个例子来源于Android SDK,有兴趣的可以自己去看看。
AsyncTask子类的实现:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + "
bytes");
}
}
在UI线程中的执行上面定义的AsyncTask的子类DownFilesTask
new DownloadFilesTask().execute(url1, url2, url3);
现在让我们结合着开始的文字来了解AsyncTask
在上面类的定义中有这样一句话:private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
这里的URL,Integer,Long便对应着所说过的Params,Progress, Result。这三个属性到底有什么用呢?我们暂时把它放一下,接着来看那四个步骤。
四个步骤,即四个回调函数,它们分别是:
onPreExecute()
由UI线程在Task执行后紧接着调用.。一般用来进行一些初始化操作。
doInBackground(Params...)
由后台进程在onPreExecute()执行完毕后调用.。这个便是处理那些耗时操作的地方了。在该函数中,你可以手动调用publishProgress(Progress...)
来向主线程传递程序的执行进度。而这个publishProgress(Progress...)实质上是将参数传递给了onProgressUpdate(Progress),通过这个方法实现向UI线程上交信息。
onProgressUpdate(Progress...) 当UI线程调用了
doInBackground(Params...)后调用(看准,不是执行完成)。它的执行时间不确定。它用于向UI线程报告当前程序执行进度。例如,它可以更新UI中的一个进度条,用于显示这个线程的执行进度。
onPostExecute(Result...) 由UI线程在后台操作执行完成后调用,它的参数便是由doInBackground(Params...)返回的值。
现在我们已经大体的了解了AsyncTask的机制。
大家可以结合着代码来理解,最好是亲自去看看Android SDK,它是任何参考书都比不上的。
最重要一点一个AsynTask只能使用一次,且只能在UI线程中实例化。
根据我的学习经历,我希望还不太了解同学可以尝试去搞懂以下两个问题:
1、三个属性在四个步骤中的分别的位置和作用(在哪个函数里,是函数的形参还是返回值)。
2、在UI线程中执行AsyncTask时传入的参数对应哪个属性,去了哪里,如何在接收到它的函数中使用。
更加详细的分析我会在不久找时间贴出来。
由于本人也是菜鸟一个,对android理解不深,难免会出现各种理解上的错误,希望大家给予指正!!
最好的学习是要自己去找寻思路,而不是只走在别人的路上。
相关文章推荐
- [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
- Android 4.4 Kitkat 音频实现及简要分析
- Linux下的多线程机制的分析与实现
- Android多线程分析之四:MessageQueue的实现
- InnoDB多版本(MVCC)实现简要分析
- Asynctask实现源码分析
- Java 多线程:分析线程池的实现原理
- Android实现异步任务机制AsyncTask 的使用及源码分析
- C#实现向多线程传参的三种方式实例分析
- php中foreach结合curl实现多线程的方法分析
- 多线程之:几种线程池的实现算法分析
- 【Android】用AsyncTask实现多线程 推荐
- 从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法
- Android多线程之AsyncTask源码分析
- android多线程学习---AsyncTask分析
- 简要分析Ogre的渲染队列实现原理
- Android多线程分析之三:Handler,Looper的实现
- Java中两种实现多线程方式的对比分析
- Linux下的多线程机制的分析与实现
- 简要分析Ogre的渲染队列实现原理(二)