`

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实例只能被执行一次,试图去执行第二次将会跑出异常。
分享到:
评论

相关推荐

    Android 使用AsyncTask异步更新UI界面

    `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...

    Android AsyncTask用法和异步加载图片.rar

    本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间...

    AsyncTask 异步多线程加载Demo

    在Android开发中,AsyncTask是一种轻量级的异步任务处理机制,主要用于UI线程与后台线程之间的通信,以实现耗时操作的异步执行,避免阻塞主线程,提高用户体验。`AsyncTask`类提供了简单易用的接口,使得开发者能够...

    异步线程AsyncTask

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

    listView异步加载(多线程和AsyncTask)以及缓存的使用

    在Android中,主线程负责UI操作,而网络请求、图片加载等耗时操作应在子线程中进行。我们可以创建一个新的线程来处理这些任务,防止阻塞主线程。通常,我们会创建一个Thread或者使用Handler和Looper配合,将网络请求...

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    为了解决这个问题,Android提供了多种异步处理机制,其中一种常见的方式是使用`Thread`配合`Handler`来实现非UI线程执行耗时任务并更新UI。本篇将详细介绍这一方法。 首先,我们需要理解Android的线程模型。Android...

    03_AsyncTask_异步方法操作之进度条

    这个方法运行在非UI线程,不能直接修改UI。 3. `publishProgress(Progress... values)`:在`doInBackground()`中调用此方法,用于向主线程发送进度更新,这里的`Progress`是进度值的类型。 4. `onProgressUpdate...

    UI线程

    首先,可以使用`AsyncTask`来异步处理数据加载,一旦数据准备完毕,再通过`onPostExecute()`方法回调到UI线程更新界面。其次,`IntentService`可以用于后台处理,而不会干扰UI。最后,`Handler`和`Runnable`组合也...

    异步任务AsyncTask

    在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,尤其是在主线程中需要执行网络请求、数据库操作或大型数据处理时。它能够避免UI线程被阻塞,提供更好的用户体验。让我们深入了解一下`...

    AsyncTask异步加载图片

    总的来说,`AsyncTask`是Android平台上的一个强大工具,能够帮助开发者轻松地实现异步操作,避免UI线程阻塞,提高应用的响应速度和用户体验。然而,对于大量或者复杂的异步任务,可能需要考虑使用更高级的解决方案,...

    Android Handler AsyncTask 异步加载

    在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...

    Asynctask异步加载的使用

    "Asynctask异步加载的使用"这一主题涵盖了如何利用Android SDK中的AsyncTask类来实现后台任务的执行,并在UI线程更新结果。以下是对这个知识点的详细讲解: AsyncTask是Android提供的一种轻量级的异步处理机制,...

    安卓拍照上传录像监控录屏相关-android录音上传到服务器上传使用AsyncTask异步任务.rar

    在提供的资源中,"android录音上传到服务器,上传使用AsyncTask异步任务.rar" 提到了使用AsyncTask来处理这一问题。下面,我们将深入探讨Android系统中的这些功能及其与AsyncTask的结合使用。 1. **拍照上传**: ...

    AsyncTask异步下载图片

    需要注意的是,AsyncTask的实例必须在UI线程中创建,并且同一个Activity中不应重复使用同一个AsyncTask实例。如果需要重新执行任务,推荐创建新的实例。此外,由于Android系统对AsyncTask的内存管理,当Activity被...

    AsyncTask异步加载(中级)

    6. **UI更新**:在onPostExecute()中,应使用runOnUiThread()或者View.post()方法更新UI,确保操作在UI线程执行。 7. **版本兼容性**:考虑到Android API级别的差异,可能需要适配低版本系统,因为自Android 3.0...

    Android AsyncTask(异步) 简单样例

    在Android开发中,异步处理是一项关键技能,尤其是在UI线程与后台数据处理之间需要进行交互时。Android AsyncTask就是一种轻量级的机制,用于在后台执行耗时操作,同时保持用户界面的响应性。本篇文章将深入探讨...

    android录音上传到服务器,上传使用AsyncTask异步任务源码

    二、使用`AsyncTask`进行异步上传 `AsyncTask`是Android提供的轻量级异步执行框架,适用于短时、不频繁的后台操作。在上传录音文件到服务器时,我们可以创建一个继承自`AsyncTask`的类,定义三个泛型参数:`Params,...

    AsyncTask异步线程之基础

    AsyncTask是Android提供的一种轻量级的异步处理机制,适用于执行短时间的后台任务,然后在UI线程更新结果。本文将深入探讨AsyncTask的基本用法、工作原理以及如何使用它来获取网络数据和展示网络图片。 首先,我们...

    Android最全最简单的异步任务AsyncTask使用解析

    AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。 AsyncTask的使用需要设定三个泛型Params、Progress和Result的类型,如AsyncTask,Integer,Void&gt;: * Params是指调用execute()方法时传入的...

Global site tag (gtag.js) - Google Analytics