AsyncTask实现多线程 (简要分析)

首先,从名字上看AsyncTask 全称 synchronious task 汉语意思可以理解为异步任务。它可以实现一个后台线程,并且可以将结果上交到UI线程。<wbr style="line-height:22px"><div style="line-height:22px"> <span style="line-height:22px; white-space:pre"></span>定义一个AsyncTask需要三个属性,它们分别是Params、Progress、Result。这三个属性我们会在下面讲解。除此以外,当一个asynchronous task执行后,将会经过4个步骤,即四个回调函数的调用。</div> <div style="line-height:22px"><span style="line-height:22px; white-space:pre"></span></div> <div style="line-height:22px"> <span style="line-height:22px; white-space:pre"></span>下面我们给出一个AsyncTask的例子,这个例子来源于Android SDK,有兴趣的可以自己去看看。</div> <div style="line-height:22px"><span style="line-height:22px"></span></div> <div style="line-height:22px">AsyncTask子类的实现:</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px"> <span style="line-height:22px">private</span><span style="line-height:22px"></span><span style="line-height:22px">class</span><span style="line-height:22px"></span><span style="line-height:22px">DownloadFilesTask</span><span style="line-height:22px"></span><span style="line-height:22px">extends</span><span style="line-height:22px"></span><span style="line-height:22px">AsyncTask</span><span style="line-height:22px">&lt;</span><span style="line-height:22px">URL</span><span style="line-height:22px">,</span><span style="line-height:22px"></span><span style="line-height:22px">Integer</span><span style="line-height:22px">,</span><span style="line-height:22px"></span><span style="line-height:22px">Long</span><span style="line-height:22px">&gt;</span><span style="line-height:22px"></span><span style="line-height:22px">{</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">protected</span><span style="line-height:22px"></span><span style="line-height:22px">Long</span><span style="line-height:22px">doInBackground</span><span style="line-height:22px">(</span><span style="line-height:22px">URL</span><span style="line-height:22px">...</span><span style="line-height:22px">urls</span><span style="line-height:22px">)</span><span style="line-height:22px"></span><span style="line-height:22px">{</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">int</span><span style="line-height:22px">count</span><span style="line-height:22px">=</span><span style="line-height:22px">urls</span><span style="line-height:22px">.</span><span style="line-height:22px">length</span><span style="line-height:22px">;</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">long</span><span style="line-height:22px">totalSize</span><span style="line-height:22px">=</span><span style="line-height:22px"></span><span style="line-height:22px">0</span><span style="line-height:22px">;</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">for</span><span style="line-height:22px"></span><span style="line-height:22px">(</span><span style="line-height:22px">int</span><span style="line-height:22px">i</span><span style="line-height:22px">=</span><span style="line-height:22px"></span><span style="line-height:22px">0</span><span style="line-height:22px">;</span><span style="line-height:22px">i</span><span style="line-height:22px">&lt;</span><span style="line-height:22px">count</span><span style="line-height:22px">;</span><span style="line-height:22px">i</span><span style="line-height:22px">++)</span><span style="line-height:22px"></span><span style="line-height:22px">{</span><span style="line-height:22px"><br style="line-height:22px"> totalSize</span><span style="line-height:22px">+=</span><span style="line-height:22px"></span><span style="line-height:22px">Downloader</span><span style="line-height:22px">.</span><span style="line-height:22px">downloadFile</span><span style="line-height:22px">(</span><span style="line-height:22px">urls</span><span style="line-height:22px">[</span><span style="line-height:22px">i</span><span style="line-height:22px">]);</span><span style="line-height:22px"><br style="line-height:22px"> publishProgress</span><span style="line-height:22px">((</span><span style="line-height:22px">int</span><span style="line-height:22px">)</span><span style="line-height:22px"></span><span style="line-height:22px">((</span><span style="line-height:22px">i</span><span style="line-height:22px">/</span><span style="line-height:22px"></span><span style="line-height:22px">(</span><span style="line-height:22px">float</span><span style="line-height:22px">)</span><span style="line-height:22px">count</span><span style="line-height:22px">)</span><span style="line-height:22px"></span><span style="line-height:22px">*</span><span style="line-height:22px"></span><span style="line-height:22px">100</span><span style="line-height:22px">));</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">}</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">return</span><span style="line-height:22px">totalSize</span><span style="line-height:22px">;</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">}</span><span style="line-height:22px"><br style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">protected</span><span style="line-height:22px"></span><span style="line-height:22px">void</span><span style="line-height:22px">onProgressUpdate</span><span style="line-height:22px">(</span><span style="line-height:22px">Integer</span><span style="line-height:22px">...</span><span style="line-height:22px">progress</span><span style="line-height:22px">)</span><span style="line-height:22px"></span><span style="line-height:22px">{</span><span style="line-height:22px"><br style="line-height:22px"> setProgressPercent</span><span style="line-height:22px">(</span><span style="line-height:22px">progress</span><span style="line-height:22px">[</span><span style="line-height:22px">0</span><span style="line-height:22px">]);</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">}</span><span style="line-height:22px"><br style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">protected</span><span style="line-height:22px"></span><span style="line-height:22px">void</span><span style="line-height:22px">onPostExecute</span><span style="line-height:22px">(</span><span style="line-height:22px">Long</span><span style="line-height:22px">result</span><span style="line-height:22px">)</span><span style="line-height:22px"></span><span style="line-height:22px">{</span><span style="line-height:22px"><br style="line-height:22px"> showDialog</span><span style="line-height:22px">(</span><span style="line-height:22px">"Downloaded "</span><span style="line-height:22px"></span><span style="line-height:22px">+</span><span style="line-height:22px">result</span><span style="line-height:22px">+</span><span style="line-height:22px"></span><span style="line-height:22px">" bytes"</span><span style="line-height:22px">);</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">}</span><span style="line-height:22px"><br style="line-height:22px"></span><span style="line-height:22px">}</span><span style="line-height:22px"><br style="line-height:22px"></span> </div> <div style="line-height:22px"><span style="line-height:22px">在UI线程中的执行上面定义的AsyncTask的子类DownFilesTask</span></div> <div style="line-height:22px"><span style="line-height:22px"><span style="line-height:22px">new</span><span style="line-height:22px"></span><span style="line-height:22px">DownloadFilesTask</span><span style="line-height:22px">().</span><span style="line-height:22px">execute</span><span style="line-height:22px">(</span><span style="line-height:22px">url1</span><span style="line-height:22px">,</span><span style="line-height:22px">url2</span><span style="line-height:22px">,</span><span style="line-height:22px">url3</span><span style="line-height:22px">);</span><span style="line-height:22px"><br style="line-height:22px"></span></span></div> <div style="line-height:22px"><span style="line-height:22px"><span style="line-height:22px"><br style="line-height:22px"></span></span></div> <div style="line-height:22px"><span style="line-height:22px"><span style="line-height:22px">现在让我们结合着开始的文字来了解AsyncTask</span></span></div> <div style="line-height:22px"><span style="line-height:22px"><span style="line-height:22px"><span style="line-height:22px; white-space:pre"></span></span></span></div> <div style="line-height:22px"> <span style="line-height:22px">在上面类的定义中有这样一句话:</span><span style="line-height:22px">private</span><span style="line-height:22px"></span><span style="line-height:22px">class</span><span style="line-height:22px"></span><span style="line-height:22px">DownloadFilesTask</span><span style="line-height:22px"></span><span style="line-height:22px">extends</span><span style="line-height:22px"></span><span style="line-height:22px">AsyncTask</span><span style="line-height:22px">&lt;</span><span style="line-height:22px">URL</span><span style="line-height:22px">,</span><span style="line-height:22px"></span><span style="line-height:22px">Integer</span><span style="line-height:22px">,</span><span style="line-height:22px"></span><span style="line-height:22px">Long</span><span style="line-height:22px">&gt;</span> </div> <div style="line-height:22px"><span style="line-height:22px">这里的URL,Integer,Long便对应着所说过的Params,Progress, Result。这三个属性到底有什么用呢?我们暂时把它放一下,接着来看那四个步骤。</span></div> <div style="line-height:22px"><span style="line-height:22px"><br style="line-height:22px"></span></div> <div style="line-height:22px"><span style="line-height:22px">四个步骤,即四个回调函数,它们分别是:</span></div> <div style="line-height:22px"><span style="line-height:22px"><br style="line-height:22px"></span></div> <div style="line-height:22px"> <span style="line-height:22px"></span> <ol style="line-height:22px; margin-top:5px; margin-right:0px; margin-bottom:5px; margin-left:40px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"> <li style="line-height:22px">onPreExecute()<span style="line-height:22px; white-space:pre"> </span>由UI线程在Task执行后紧接着调用.。一般用来进行一些初始化操作。</li> <li style="line-height:22px">doInBackground(Params...)<span style="line-height:22px; white-space:pre"> </span>由后台进程在onPreExecute()执行完毕后调用.。这个便是处理那些耗时操作的地方了。在该函数中,你可以手动调用publishProgress(Progress...)<span style="line-height:22px; white-space:pre"> </span>来向主线程传递程序的执行进度。而这个publishProgress(Progress...)实质上是将参数传递给了onProgressUpdate(Progress),通过这个方法实现向UI线程上交信息。</li> <li style="line-height:22px"> <code style="line-height:22px"><span style="font-family:Arial,Helvetica,sans-serif; line-height:22px">onProgressUpdate(Progress...)<span style="line-height:22px; white-space:pre"> </span>当</span>UI线程调用了</code><code style="line-height:22px"><span style="line-height:22px; font-family:Arial,Helvetica,sans-serif">doInBackground(Params...)后调用(看准,不是执行完成)。它的执行时间不确定。它用于向UI线程报告当前程序执行进度。例如,它可以更新UI中的一个进度条,用于显示这个线程的执行进度。</span></code> </li> <li style="line-height:22px">onPostExecute(Result...) 由UI线程在后台操作执行完成后调用,它的参数便是由doInBackground(Params...)返回的值。</li> </ol> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">现在我们已经大体的了解了AsyncTask的机制。</div> <div style="line-height:22px">大家可以结合着代码来理解,最好是亲自去看看Android SDK,它是任何参考书都比不上的。</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">最重要一点一个AsynTask只能使用一次,且只能在UI线程中实例化。</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">根据我的学习经历,我希望还不太了解同学可以尝试去搞懂以下两个问题:</div> <div style="line-height:22px">1、三个属性在四个步骤中的分别的位置和作用(在哪个函数里,是函数的形参还是返回值)。</div> <div style="line-height:22px">2、在UI线程中执行AsyncTask时传入的参数对应哪个属性,去了哪里,如何在接收到它的函数中使用。</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">更加详细的分析我会在不久找时间贴出来。</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">由于本人也是菜鸟一个,对android理解不深,难免会出现各种理解上的错误,希望大家给予指正!!</div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px"><br style="line-height:22px"></div> <div style="line-height:22px">最好的学习是要自己去找寻思路,而不是只走在别人的路上。</div> </div> </wbr>

你可能感兴趣的:(AsyncTask)