看上去修改后的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的源代码如下所示:
// 设置三种类型参数分别为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,不但可以抓取网页的内容,还可以实时更新读取的进度。读者尝试读取一个较大的网页,看看百分比的更新情况。
1.PageTask task = new PageTask();
2.task.execute(url.getText().toString());
分享到:
相关推荐
通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...
在Android应用开发中,异步处理是至关重要的,特别是在处理耗时操作如网络请求或大量数据计算时。Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行...
在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。这个“Android AsyncTask Demo”是开发者为了学习和理解AsyncTask工作原理而编写的示例代码。下面我们将...
Android的异步任务(AsyncTask)是Android平台上用于在后台执行耗时操作并更新UI的主要工具,特别适合处理短时间的、与用户界面交互的任务。在Android应用开发中,由于主线程(UI线程)负责处理用户交互,因此不能在...
`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三个泛型参数,通常分别代表`Params`(输入参数)、`Progress`(后台任务进度)和`Result`(返回结果)。...
在Android开发中,异步处理是非常重要的一环,特别是在与服务器进行数据交互时,为了保持UI线程的流畅性,避免出现"应用无响应"(ANR)的情况,开发者通常会使用`AsyncTask`。本例子是关于如何将`AsyncTask`与`...
本篇文章将深入探讨Android AsyncTask的工作原理、使用方法以及一些常见应用场景。 **一、Android AsyncTask概述** AsyncTask是Android提供的一个类,它允许开发者在后台线程执行任务,然后在UI线程更新结果,以...
在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...
在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...
在Android应用开发中,异步处理是至关重要的,特别是在涉及到网络操作时,如下载图片。Android的`AsyncTask`类就是一个轻量级的工具,用于在后台线程执行耗时任务,然后在UI线程更新结果,从而避免了主线程(UI线程...
在Android应用开发中,异步处理是至关重要的,因为它能够避免主线程被阻塞,从而提升用户体验。`AsyncTask`是Android提供的一种轻量级的异步处理机制,特别适用于执行耗时操作,如网络请求、数据库操作或图片下载等...
本示例“AsyncTask应用下载MP3”就是演示如何利用`AsyncTask`来实现MP3文件的下载,并通过进度条动态展示下载进度。 `AsyncTask`有三个泛型参数:`Params`、`Progress`和`Result`。`Params`代表异步任务执行前需要...
在Android应用开发中,异步处理是至关重要的,因为它允许我们执行耗时操作而不阻塞主线程,从而避免UI无响应(ANR)错误。...理解`AsyncTask`的工作原理和生命周期管理是编写高效、健壮的Android应用的关键。
本文将深入探讨Android的AsyncTask及其与Handler的对比。 **AsyncTask详解** AsyncTask是Android SDK提供的一种轻量级的异步处理机制,特别适合于执行短时间的、与UI相关的后台任务。它的主要优点在于简化了UI更新...
`AsyncTask`是Android提供的一种轻量级的异步处理机制,尤其适用于短时间的后台操作,如网络请求、数据库操作等。本篇文章将深入探讨`AsyncTask`的使用方法及其在实际开发中的应用。 `AsyncTask`包含三个泛型参数,...
在Android开发中,`AsyncTask` 是一个用于在后台线程执行耗时操作并更新UI的工具类。它特别适用于处理网络请求、文件下载等任务,这些任务通常需要在后台执行,以免阻塞主线程(UI线程)并导致应用无响应。在描述中...
总的来说,理解和掌握`AsyncTask`对于Android开发者来说是非常重要的,它可以帮助我们构建更加流畅、响应迅速的应用。通过实践`AsyncTaskDemo`,你可以更好地理解如何在实际项目中应用`AsyncTask`进行图片的异步下载...
Android AsyncTask 是一个内置的异步执行框架,专为在Android应用程序中进行轻量级的后台操作而设计。它使得开发者可以在不阻塞UI线程的情况下,执行耗时操作,如网络请求、数据库操作等,同时可以方便地更新UI。这...
Android异步任务AsyncTask使用解析是指在Android应用程序中使用AsyncTask来实现异步任务的处理。AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。AsyncTask主要用来更新UI线程,比较耗时的...
在Android中,直接在主线程进行耗时操作会导致应用无响应(ANR),因此,AsyncTask为开发者提供了便捷的方式来避免这种情况。 AsyncTask的核心在于它的四个主要方法: 1. `onPreExecute()`:这个方法在后台任务...