[转载]安卓开发笔记——关于AsyncTask的使用 - Balla_兔子 - 博客园

[转载]安卓开发笔记——关于AsyncTask的使用 – Balla_兔子 – 博客园.

在安卓开发中,我们经常要进行一些耗时操作,比如数据库操作,获取网络资源,读取内存文件等等,当我们在处理这些耗时操作的时候,如果我们直接在 UI主线程进行,那么可能会导致阻塞UI主线程,使得UI界面卡顿,带来很不好的用户体验,因此安卓也给我们提供了2个异步操作的类,Handler和 AsyncTask。

今天先讲AsyncTask,AsyncTask类是Andorid提供给我们的一个轻量级异步类,算是一个框架,它对线程之间的通讯进行了封装,并且提供了简易的编程操作,使得我们可以很轻松的实现后台线程和UI主线程之间的通讯。

我写了一个异步获取网络图片的小例子,先来看实现效果:

 

以上是官网对AsyncTask的一些描述,大致意思是:

AsyncTask是一个易操作线程使用类,它可以帮助我们把后台线程处理程序的结果发送给UI主线程,使UI线程得到更新。

AsyncTask类提供了3个泛型参数(Params,Progress,Result)和4个执行步骤(下文会具体提及)

 

先来看下3个泛型参数

1、Params:这是一个任务参数,一般我们会定义成String类型的,例如本例子中要获取网络资源的URL地址

2、Progress:任务执行的刻度,一般我们会定义成Integer类型

3、Result:返回结果类型,例如本例中是对网络图片进行获取,那么它的返回类型应该是BitMap

 

再来看下4个步骤:

当我们的类去实现AsyncTask类的时候至少需要实现doInBackground(Params…)方法,这里作为学习,我把每一个的具体工作任务也说说

它的执行顺序是这样的 onPreExecute–>doInBackground–>onProgressUpdate–>onPostExecute

1、onPreExecute:这是一个预处理方法,在任务开始的时候执行,我们可以在这里进行一些控件的实例化,设置属性等。(非必须)

2、doInBackground:这是一个任务操作方法,也是最重要的一个方法,所有的耗时操作都应该在这里执行。(必须)

3、onProgressUpdate:这是一个进度即时更新方法,在这里我们可以即时更新任务滚动条的进度。(非必须,当在doInBackground里调用publishProgress时触发)

4、onPostExecute:这是一个任务结果处理方法,在doInBackground里执行完任务,会将结果通知给这个类,在这类中我们可以对UI进行更新操作(非必须)

上面的1、3、4是UI主线程触发调用的,所以可以对UI进行更新操作,而第2步是个异步操作,不能在里面进行UI的更新操作。

 

关于AsyncTask的调用,其实非常简单,我们在AsyncTask类被继承实现的时候,在主线程直接对其对象调用execute(Params..)方法即可。

 

好了,文字介绍到此结束,上代码:

1、布局文件

<span class="pln">
</span><span class="pun">&</span><span class="pln">nbsp</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">&</span><span class="pln">nbsp</span><span class="pun">;</span><span class="pln">
</span>

2、AsyncTask的实现类

<span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">example</span><span class="pun">.</span><span class="pln">asynctasktest</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">ByteArrayOutputStream</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">IOException</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">InputStream</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">OutputStream</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">apache</span><span class="pun">.</span><span class="pln">http</span><span class="pun">.</span><span class="typ">HttpResponse</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">apache</span><span class="pun">.</span><span class="pln">http</span><span class="pun">.</span><span class="pln">client</span><span class="pun">.</span><span class="typ">ClientProtocolException</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">apache</span><span class="pun">.</span><span class="pln">http</span><span class="pun">.</span><span class="pln">client</span><span class="pun">.</span><span class="typ">HttpClient</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">apache</span><span class="pun">.</span><span class="pln">http</span><span class="pun">.</span><span class="pln">client</span><span class="pun">.</span><span class="pln">methods</span><span class="pun">.</span><span class="typ">HttpGet</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">apache</span><span class="pun">.</span><span class="pln">http</span><span class="pun">.</span><span class="pln">impl</span><span class="pun">.</span><span class="pln">client</span><span class="pun">.</span><span class="typ">DefaultHttpClient</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">ProgressDialog</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Bitmap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">BitmapFactory</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">AsyncTask</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageView</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyAsyncTask</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">AsyncTask</span><span class="pun">&</span><span class="pln">lt</span><span class="pun">;</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bitmap</span><span class="pun">&</span><span class="pln">gt</span><span class="pun">;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ImageView</span><span class="pln"> imageView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ProgressDialog</span><span class="pln"> progressDialog</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MyAsyncTask</span><span class="pun">(</span><span class="typ">ImageView</span><span class="pln"> imageView</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ProgressDialog</span><span class="pln"> progressDialog</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">imageView </span><span class="pun">=</span><span class="pln"> imageView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">progressDialog </span><span class="pun">=</span><span class="pln"> progressDialog</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="com">/**
* 执行第一步 这里为预处理操作,被UI线程所调用(可以在这里完成进度条的属性设置)
*/</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPreExecute</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onPreExecute</span><span class="pun">();</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">setTitle</span><span class="pun">(</span><span class="str">"当前任务"</span><span class="pun">);</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">setMessage</span><span class="pun">(</span><span class="str">"正在下载图片,请稍后..."</span><span class="pun">);</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">setProgressStyle</span><span class="pun">(</span><span class="typ">ProgressDialog</span><span class="pun">.</span><span class="pln">STYLE_HORIZONTAL</span><span class="pun">);</span><span class="com">//设置进度条样式,横项</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="com">/**
* 执行第二步 这里为异步线程,在这里处理耗时任务操作(比如:下载,读取文件)
* 通过调用publishProgress方法(传递即时任务进度)可以触发onProgressUpdate的执行
*/</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="typ">Bitmap</span><span class="pln"> doInBackground</span><span class="pun">(</span><span class="typ">String</span><span class="pun">...</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> path</span><span class="pun">=</span><span class="kwd">params</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="typ">Bitmap</span><span class="pln"> bitmap</span><span class="pun">=</span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="typ">HttpClient</span><span class="pln"> httpClient</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DefaultHttpClient</span><span class="pun">();</span><span class="pln">
</span><span class="typ">HttpGet</span><span class="pln"> httpGet</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HttpGet</span><span class="pun">(</span><span class="pln">path</span><span class="pun">);</span><span class="pln">
</span><span class="typ">InputStream</span><span class="pln"> inputStream</span><span class="pun">=</span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">HttpResponse</span><span class="pln"> httpResponse</span><span class="pun">=</span><span class="pln">httpClient</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">httpGet</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">httpResponse</span><span class="pun">.</span><span class="pln">getStatusLine</span><span class="pun">().</span><span class="pln">getStatusCode</span><span class="pun">()==</span><span class="lit">200</span><span class="pun">){</span><span class="pln">
</span><span class="com">//连接成功</span><span class="pln">
</span><span class="com">// HttpEntity entity=httpResponse.getEntity();</span><span class="pln">
</span><span class="com">// byte[] data=EntityUtils.toByteArray(entity);</span><span class="pln">
</span><span class="com">// bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);</span><span class="pln">
 
inputStream</span><span class="pun">=</span><span class="pln">httpResponse</span><span class="pun">.</span><span class="pln">getEntity</span><span class="pun">().</span><span class="pln">getContent</span><span class="pun">();</span><span class="pln">
</span><span class="typ">ByteArrayOutputStream</span><span class="pln"> outputStream</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ByteArrayOutputStream</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> fileSize</span><span class="pun">=</span><span class="pln">httpResponse</span><span class="pun">.</span><span class="pln">getEntity</span><span class="pun">().</span><span class="pln">getContentLength</span><span class="pun">();</span><span class="com">//文件总大小</span><span class="pln">
</span><span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> data</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">byte</span><span class="pun">[</span><span class="lit">1024</span><span class="pun">];</span><span class="com">//每次读取的大小</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> len</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="com">//本次读取的大小</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> total</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="com">//累计读取的大小</span><span class="pln">
</span><span class="kwd">while</span><span class="pun">((</span><span class="pln">len</span><span class="pun">=</span><span class="pln">inputStream</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="pln">data</span><span class="pun">))!=-</span><span class="lit">1</span><span class="pun">){</span><span class="pln">
total</span><span class="pun">+=</span><span class="pln">len</span><span class="pun">;</span><span class="com">//累计读取的大小</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> values</span><span class="pun">=(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="pun">((</span><span class="pln">total</span><span class="pun">/(</span><span class="kwd">float</span><span class="pun">)</span><span class="pln">fileSize</span><span class="pun">)*</span><span class="lit">100</span><span class="pun">);</span><span class="com">//得到当前任务进行百分比</span><span class="pln">
publishProgress</span><span class="pun">(</span><span class="pln">values</span><span class="pun">);</span><span class="com">//触发onProgressUpdate更新即时进度</span><span class="pln">
outputStream</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">data</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> len</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> result</span><span class="pun">=</span><span class="pln">outputStream</span><span class="pun">.</span><span class="pln">toByteArray</span><span class="pun">();</span><span class="com">//转换为字节数组</span><span class="pln">
bitmap</span><span class="pun">=</span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeByteArray</span><span class="pun">(</span><span class="pln">result</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> result</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ClientProtocolException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">finally</span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">inputStream</span><span class="pun">!=</span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
inputStream</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> bitmap</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="com">/**
* 执行第三步 这里为实时UI更新操作,被UI线程所调用 在这里可以即时更新(如进度条进度)
*/</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onProgressUpdate</span><span class="pun">(</span><span class="typ">Integer</span><span class="pun">...</span><span class="pln"> values</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onProgressUpdate</span><span class="pun">(</span><span class="pln">values</span><span class="pun">);</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">setProgress</span><span class="pun">(</span><span class="pln">values</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="com">/**
* 执行第四步 在这里会返回doInBackground的操作结果,被UI线程调用,更新最后UI结果
*/</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPostExecute</span><span class="pun">(</span><span class="typ">Bitmap</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onPostExecute</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
progressDialog</span><span class="pun">.</span><span class="pln">dismiss</span><span class="pun">();</span><span class="pln">
imageView</span><span class="pun">.</span><span class="pln">setImageBitmap</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span>

3、主类

<span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">example</span><span class="pun">.</span><span class="pln">asynctasktest</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">ProgressDialog</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">ActionBarActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageView</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">ActionBarActivity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ImageView</span><span class="pln"> imageView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> bt_download</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ProgressDialog</span><span class="pln"> progressDialog</span><span class="pun">;</span><span class="com">//进度对话框</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> path</span><span class="pun">=</span><span class="str">"http://img.pconline.com.cn/images/photoblog/5/3/7/5/5375781/20096/6/1244302842840.jpg"</span><span class="pun">;</span><span class="com">//下载图片路径</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
 
imageView</span><span class="pun">=(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">imageView</span><span class="pun">);</span><span class="pln">
bt_download</span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">bt_download</span><span class="pun">);</span><span class="pln">
progressDialog</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ProgressDialog</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
 
bt_download</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">MyAsyncTask</span><span class="pln"> myAsyncTask</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyAsyncTask</span><span class="pun">(</span><span class="pln">imageView</span><span class="pun">,</span><span class="pln">progressDialog</span><span class="pun">);</span><span class="pln">
myAsyncTask</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">path</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span>

 

代码到此结束,注释很详细应该很好理解。

使用AsyncTask类,以下是几条必须遵守的准则:

  • Task的实例必须在UI主线程中创建。
  • execute方法必须在UI主线程中调用。
  • 不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法。
  • 该task只能被执行一次,否则多次调用时将会出现异常。

当然AsyncTask类不止这些东西,还有线程池的概念,今天先不讲,过几天连同Handler一起说。

对于简单的异步操作,掌握这些已经够了。

 

项目代码:http://pan.baidu.com/s/1kTkTgm7

 

作者:Balla_兔子
出处:http://www.cnblogs.com/lichenwei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册