[转载]安卓开发笔记——关于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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!