`

UI线程如何使用AsyncTask进行异步操作

阅读更多
       android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。

       AsyncTask定义了三种通用类型:Params, Progress和Result,Params表示异步任务执行时传入的参数,Progress表示异步任务执行过程中发布的数据,Result表示异步任务执行的结果。

      AsyncTask还定义了四个回调函数:onPreExecute, doInBackground, onProgressUpdate和onPostExecute来管理异步操作的过程:
     1.  onPreExecute(), 异步任务开始执行时,由UI线程调用,比如在UI上展示进度条。
     2. doInBackground(Params...), onPreExecute()执行完后,立即由后台线程调用. 该方法用来执行后台的操作,可能需要花费不少时间。参数Params传入该方法,处理结果返回并作为最后一步onPostExecute(Result)的参数值传入。该方法内,还可以使用方法publishProgress(Progress...)来发布异步操作的进展状态,发布的进展状态数据作为onProgressUpdate(Progress...)的参数传入,被UI线程调用。
     3. onProgressUpdate(Progress...), 和2提到的一样,该方法在publishProgress(Progress...)执行后,由UI线程调用。该方法用来在UI上展示后台操作正在执行的任何状态,不能确定它会执行多久。比如,它可以使用动画来呈现执行过程的状态栏或者在Text里展示执行日志等。
     4. onPostExecute(Result), 后台线程操作完毕后,由UI线程调用,doInBackground(Params...)的返回值作为其参数传入。

     要实现这样的异步任务,我们必须使用一个类继承自AsyncTask,并且该子类至少要重载doInBackground(Params...)方法,我们还经常需要重载onPostExecute(Result)方法。下面是一个继承自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");
     }
 }

      通过以下代码即可启动该异步任务:
 new DownloadFilesTask().execute(url1, url2, url3);


      可以通过调用方法cancel(boolean)来取消异步任务,该方法会使UI线程在方法doInBackground(Object[]) 返回后调用方法onCancelled(Object),并且方法onPostExecute(Object)将不会被调用。 cancel(boolean)调用后,应该在方法doInBackground(Object[])里周期性的检查isCancelled()的返回值,以尽早知道异步任务是否已经取消了。

      AsyncTask实例必须在UI线程里创建,并且方法execute(Params...)必须在UI线程里执行。不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) 这几个回调函数。AsyncTask实例只能被执行一次,试图去执行第二次将会跑出异常。
分享到:
评论

相关推荐

    异步线程AsyncTask

    首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...

    Android异步任务之AsyncTask源码

    这时候我们就不能直接在UI线程中(主线程)中去完成这些“耗时操作”,因为,UI线程主要是用来更新界面UI,如果一次进行太多的任务处理,并且这些任务需要相当的时间来完成,就会造成UI线程堵塞,结果可能是应用无响应...

    AsyncTask异步类下载图片案例

    An­droid 的 UI 线程主要负责处理用户的按键事件、触屏事件等。...但由于新线程不允许直接更新山 I 组件,为了解决这个问题,An­droid 提供了异步任务 (Async­Task) 的方式实现异步线程的操作。

    Android学习笔记(三二):线程:后台异步任务AsyncTask_IT168文库

    Android学习笔记(三二):线程:后台异步任务AsyncTask_IT168文库

    Android AsyncTask实现异步处理任务的方法详解

    在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 Android 单线程模型概念详解://www.jb51.net/article/112165.htm 在单线程模型中始终要记住两条...

    AsyncTask官方文档教程整理

    AsyncTask可以轻松正确的使用UI线程,这个类允许你在后台操作,并且不需要使用threads或者handler将结果发布到UI线程。 AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间...

    Android带进度条的下载图片示例(AsyncTask异步任务)

    在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作。如果放在主线程中 会造成阻塞 而...

    Android AsyncTask 后监听异步加载完毕的动作详解

     当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用...

    Android中AsyncTask异步任务使用详细实例(一)

    AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。 使用AsyncTask最少要重写以下...

    listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存图片

    1,通过异步加载,避免阻塞UI线程 2,通过LruCache,将已经下载的图片放到内存中

    AsyncTaskDemo异步消息处理机制

    Android 提供了一个好用的工具---AsyncTask ,方便我们在子线程中对 UI 进行操作,AsyncTask 背后的实现原理也是基于异步消息处理机制的。

    Android中AsyncTask的使用com.scott.async

    任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,...

    深入了解Android中的AsyncTask

    通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。 我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI...

    详解android进行异步更新UI的四种方式

    使用AsyncTask异步任务; 使用runOnUiThread(action)方法; 使用Handler的post(Runnabel r)方法; 下面分别使用四种方式来更新一个TextView。 1.使用Handler消息传递机制 package ...

    Android中AsyncTask的入门使用学习指南

    对于耗时的操作就需要放到子线程中操作,操作完成后需要通知UI线程进行更新等操作,这就需要Android的异步消息机制(创建一个Message对象,使用Handler发送出去,然后在Handler的handleMessage()方法中获得刚才发送...

    关于AsyncTask的使用1

    1.简介AsyncTask 是Android 开发一个常用的多线程异步任务组件。为什么要用多线程异步任务的组件呢?因为安卓应用的主线程(也叫UI线程)不允许有耗

    Android异步刷新UI多种实现方案

    提供Asynctask Handler+thread 以及 TimerTask等四种方式实现刷新UI,也可以实现类似定时器的效果

    Android AsyncTask使用以及源码解析

    当然为了简化我们的操作,在Android1.5以后为我们提供了AsyncTask类,它能够将子线程处理完成后的结果返回到UI线程中,之后我们便可以根据这些结果进行一列的UI操作了。 AsyncTask的使用方法  实际上AsyncTask内部...

    android AsyncTask详细介绍

    AsyncTask和Handler对比 ... 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流

    Android AsyncTask源码分析

    Android中只能在主线程中进行UI操作,如果是其它子线程,需要借助异步消息处理机制Handler。除此之外,还有个非常方便的AsyncTask类,这个类内部封装了Handler和线程池。本文先简要介绍AsyncTask的用法,然后分析...

Global site tag (gtag.js) - Google Analytics