`
亚当爱上java
  • 浏览: 705850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android中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的源代码如下所示:

// 设置三种类型参数分别为String,Integer,String  
    class PageTask extends AsyncTask<String, Integer, String> {  
  
        // 可变长的输入参数,与AsyncTask.exucute()对应  
        @Override  
        protected String doInBackground(String... params) {  
            try {  
                HttpClient client = new DefaultHttpClient();  
                // params[0] 代表连接的url  
                HttpGet get = new HttpGet(params[0]);  
                HttpResponse response = client.execute(get);  
                HttpEntity entity = response.getEntity();  
                long length = entity.getContentLength();  
                InputStream is = entity.getContent();  
                String s = null;  
                if (is != null) {  
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                    byte[] buf = new byte[128];  
                    int ch = -1;  
                    int count = 0;  
                    while ((ch = is.read(buf)) != -1) {  
                        baos.write(buf, 0, ch);  
                        count += ch;  
                        if (length > 0) {  
                            // 如果知道响应的长度,调用publishProgress()更新进度  
                            publishProgress((int) ((count / (float) length) * 100));  
                        }  
                        // 为了在模拟器中清楚地看到进度,让线程休眠100ms  
                        Thread.sleep(100);  
                    }  
                    s = new String(baos.toByteArray());            }  
                // 返回结果  
                return s;  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  
        @Override  
        protected void onCancelled() {  
            super.onCancelled();  
        }  
        @Override  
        protected void onPostExecute(String result) {  
            // 返回HTML页面的内容  
            message.setText(result);  
        }  
        @Override  
        protected void onPreExecute() {  
            // 任务启动,可以在这里显示一个对话框,这里简单处理  
            message.setText(R.string.task_started);  
        }  
        @Override  
        protected void onProgressUpdate(Integer... values) {  
            // 更新进度  
            message.setText(values[0]);  
        }  
    }

执行PageTask非常简单,只需要调用如下代码。重新运行NetworkActivity,不但可以抓取网页的内容,还可以实时更新读取的进度。读者尝试读取一个较大的网页,看看百分比的更新情况。 
[code="java"PageTask task = new PageTask();  
task.execute(url.getText().toString());]
分享到:
评论

相关推荐

    android中AsyncTask的用法

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

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

    在Android应用开发中,异步处理是至关重要的,特别是在处理耗时操作如网络请求或大量数据计算时。Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行...

    Android中AsyncTask的用法实例[收集].pdf

    下面详细阐述AsyncTask的工作原理以及代码实例中的相关知识点。 首先,AsyncTask是一个抽象类,它允许你执行后台线程的操作,并将结果更新到UI线程。AsyncTask的典型用法涉及以下几个步骤: 1. onPreExecute(): 这...

    Android中AsyncTask与handler用法实例分析

    Android开发中,异步处理是必不可少的,尤其是当涉及到与用户界面交互时。AsyncTask和Handler是Android系统...在Android开发中,合理使用这两种机制可以有效地提升应用的用户体验,避免UI线程被阻塞导致的无响应问题。

    AsyncTask类实例详解

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制。它通过封装了线程管理和与主线程的交互,简化了在UI线程中处理异步任务的流程。下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 ...

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    Android 使用AsyncTask异步更新UI界面

    综上所述,虽然`AsyncTask`在早期的Android开发中广泛使用,但随着Android平台的演进,开发者应逐渐转向更现代的异步处理机制,以提高应用的稳定性和性能。不过,理解`AsyncTask`的工作原理仍然是了解Android多线程...

    Android 线程AsyncTask逐步在list中加入条目

    总之,通过这个例子,新手可以了解到如何使用`AsyncTask`处理多线程,以及如何在Android应用中动态更新ListView。这是一项基础但至关重要的技能,对于理解和优化Android应用性能至关重要。在实际项目中,还可以根据...

    Android中AsyncTask实现多线程计数

    在Android应用开发中,多线程技术是必不可少的,它能让我们在不阻塞用户界面(UI)的情况下执行耗时操作。AsyncTask是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行计算,并在UI线程更新...

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

    - **版本兼容性**:自Android 3.0(API级别11)开始,AsyncTask默认在应用的后台进程中执行,而在更早的版本中,它们在主线程的上下文中运行。这可能导致在旧版本设备上表现不一致。 - **生命周期问题**:如果在...

    Android AsyncTask用法巧用实例代码

    下面我们将详细探讨Android AsyncTask的用法及其在实际应用中的实例。 首先,`AsyncTask`有三个泛型参数:`, Progress, Result&gt;`。在这个例子中,`ArrayList&lt;ContactInfo&gt;`被用作输入参数类型(Params),`Integer`...

    Android Handler AsyncTask 异步加载

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

    Android AsyncTask 源码解析

    通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...

    android asyncTask线程应用

    在Android应用开发中,由于主线程(UI线程)负责处理用户交互,因此不能在此线程上执行长时间运行的任务,否则会导致应用程序无响应(ANR)。AsyncTask就是为了规避这个问题而设计的。 AsyncTask分为三个基本步骤:...

    Android的AsyncTask异步任务

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

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

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

    Android异步操作实例源码----AsyncTask类

    以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap&gt; 其中包含三个异步操作类可供测试

    Android Studio实例代码.zip_Android app实例_Android实例_android app源码_and

    例如,观察MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)架构的应用实例,可以学习如何分离业务逻辑和视图层,提高代码可维护性。 5. **Android Studio消息(msg)** 这个标签可能是指使用Android ...

    Android AsyncTask异步处理下载网页

    `AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三个泛型参数,通常分别代表`Params`(输入参数)、`Progress`(后台任务进度)和`Result`(返回结果)。...

    Android中AsyncTask的用法实例分享

    在本文中,我们将深入探讨`AsyncTask`的用法和特点。 首先,`AsyncTask`设计的核心在于它允许任务在后台线程执行,同时保证回调方法(如`onPreExecute()`、`onProgressUpdate()`和`onPostExecute()`)在主线程中...

Global site tag (gtag.js) - Google Analytics