`
mmdev
  • 浏览: 13304298 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android的* AsyncTask

 
阅读更多
*AsyncTask

看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。

为了解决这一问题,OPhone在1.5版本引入了AsyncTask。AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了 匿名线程存在的问题。

AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型 Params,Progress和Result。

* Params 启动任务执行的输入参数,比如HTTP请求的URL。
* Progress 后台任务执行的百分比。
* Result 后台执行任务最终返回的结果,比如String。

AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。

* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
* onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。

PageTask扩展了AsyncTask,在 doInBackground()方法中读取网页内容。PageTask的源代码如下所示:
  1. // 设置三种类型参数分别为String,Integer,String
  2. class PageTask extends AsyncTask<String, Integer, String> {

  3. // 可变长的输入参数,与AsyncTask.exucute()对应
  4. @Override
  5. protected String doInBackground(String... params) {
  6. try {
  7. HttpClient client = new DefaultHttpClient();
  8. // params[0] 代表连接的url
  9. HttpGet get = new HttpGet(params[0]);
  10. HttpResponse response = client.execute(get);
  11. HttpEntity entity = response.getEntity();
  12. long length = entity.getContentLength();
  13. InputStream is = entity.getContent();
  14. String s = null;
  15. if (is != null) {
  16. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  17. byte[] buf = new byte[128];
  18. int ch = -1;
  19. int count = 0;
  20. while ((ch = is.read(buf)) != -1) {
  21. baos.write(buf, 0, ch);
  22. count += ch;
  23. if (length > 0) {
  24. // 如果知道响应的长度,调用publishProgress()更新进度
  25. publishProgress((int) ((count / (float) length) * 100));
  26. }
  27. // 为了在模拟器中清楚地看到进度,让线程休眠100ms
  28. Thread.sleep(100);
  29. }
  30. s = new String(baos.toByteArray()); }
  31. // 返回结果
  32. return s;
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. return null;
  37. }
  38. @Override
  39. protected void onCancelled() {
  40. super.onCancelled();
  41. }
  42. @Override
  43. protected void onPostExecute(String result) {
  44. // 返回HTML页面的内容
  45. message.setText(result);
  46. }
  47. @Override
  48. protected void onPreExecute() {
  49. // 任务启动,可以在这里显示一个对话框,这里简单处理
  50. message.setText(R.string.task_started);
  51. }
  52. @Override
  53. protected void onProgressUpdate(Integer... values) {
  54. // 更新进度
  55. message.setText(values[0]);
  56. }
  57. }
复制代码
执行PageTask非常简单,只需要调用如下代码。重新运行NetworkActivity,不但可以抓取网页的内容,还可以实时更新读取的进度。读者尝试读取一个较大的网页,看看百分比的更新情况。
  1. PageTask task = new PageTask();
  2. task.execute(url.getText().toString());
复制代码
分享到:
评论

相关推荐

    Android Handler AsyncTask 异步加载

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

    Android AsyncTask 源码解析

    **Android AsyncTask 源码解析** AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding...

    Android用AsyncTask异步加载图片

    4. **启动AsyncTask**:在需要加载图片的地方实例化并启动`LoadImageTask`,传入图片URL。 **注意事项:** - `AsyncTask`不应在多个Activity之间共享,因为它可能导致内存泄漏。最好每个Activity有自己的`AsyncTask...

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

    Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类...

    Android AsyncTask Demo 自己参考网络写的学习 demo

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。这个“Android AsyncTask Demo”是开发者为了学习和理解AsyncTask工作原理而编写的示例代码。下面我们将...

    android中AsyncTask的用法

    在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...

    Android异步任务AsyncTask的简单DEMO

    AsyncTask是Android SDK提供的一种轻量级异步处理框架,适用于简单且快速的任务。下面将详细解释AsyncTask的工作原理和使用方法。 **AsyncTask概述** AsyncTask是Android中的一个抽象类,用于在后台线程执行任务,...

    异步加载AsyncTask

    AsyncTask是Android SDK提供的一种轻量级的异步处理框架,适用于进行短时间、非复杂的异步任务。这篇博客源码(http://blog.csdn.net/In_No_Vation/article/details/52567991)深入探讨了AsyncTask的使用方法和内部...

    Android AsyncTask(异步) 简单样例

    Android AsyncTask就是一种轻量级的机制,用于在后台执行耗时操作,同时保持用户界面的响应性。本篇文章将深入探讨Android AsyncTask的工作原理、使用方法以及一些常见应用场景。 **一、Android AsyncTask概述** ...

    android AsyncTask详细介绍

    本文将深入探讨Android的AsyncTask及其与Handler的对比。 **AsyncTask详解** AsyncTask是Android SDK提供的一种轻量级的异步处理机制,特别适合于执行短时间的、与UI相关的后台任务。它的主要优点在于简化了UI更新...

    Android_AsyncTask

    在Android开发中,AsyncTask是一种轻量级的异步任务处理框架,用于在后台线程执行耗时操作,然后在UI线程更新结果。它的设计初衷是为了简化在主线程(UI线程)与后台线程之间的数据交互,避免因为长时间运行的任务...

    Android 使用AsyncTask异步更新UI界面

    为了在主线程之外执行耗时操作,比如网络请求或数据库查询,Android提供了多种异步处理机制,其中`AsyncTask`是早期常用的一种。本文将详细探讨如何在Android中使用`AsyncTask`来异步更新UI界面。 ### 一、...

    详解Android中用于线程处理的AsyncTask类的用法及

    AsyncTask 是 Android 平台上一个轻量级的异步任务框架,主要用于在后台线程执行耗时操作,然后将结果安全地更新到 UI 线程。它简化了线程管理和数据传递,使得开发者能够更方便地处理耗时任务与用户界面的交互。 *...

    Android中AsyncTask与handler用法实例分析

    **AsyncTask** 是一个轻量级的异步任务框架,适合用于执行较短的后台操作,然后更新UI。AsyncTask有三个泛型参数:`Params`(后台任务的输入参数)、`Progress`(后台任务的进度)和`Result`(后台任务的输出结果)...

    Android_AsyncTask_详解

    ### Android AsyncTask 详解 #### 一、AsyncTask 概述 `AsyncTask` 是 Android 提供的一个用于执行后台任务的轻量级框架。它能够帮助开发者轻松地在后台线程执行耗时的操作,并且更新 UI 界面而无需直接操作线程和...

    Android_AsyncTask使用

    **AsyncTask** 是 Android 提供的一个用于在后台线程执行耗时操作并在 UI 线程更新结果的类。它简化了多线程编程的过程,使开发者无需手动管理线程和处理器就能轻松地在主线程上执行耗时的操作。 #### 二、...

    Android开发之AsyncTask机制及使用细节例子源码

    在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...

    Android的AsyncTask异步任务

    在Android应用开发中,AsyncTask是一个非常重要的工具类,它为开发者提供了一种方便的机制来执行后台操作,同时能够在线程间进行数据交互,确保UI的流畅性。本篇文章将深入探讨Android的AsyncTask异步任务,以及如何...

    android AsyncTask 断点下载实例

    2. **创建AsyncTask**:创建DownloadTask实例,传入文件URL。在`onPreExecute()`方法中,可以初始化UI,如显示进度条。 3. **doInBackground()**:这是AsyncTask的核心,它在后台线程执行。使用HttpURLConnection或...

Global site tag (gtag.js) - Google Analytics