Android
中我们使用AsyncTask时,一般是把它当Activity的内部类来使用的。原因,这样可以简单的在更新进度onProgressUpdate 和
执行完成时onPostExecute,
直接操作Activity的界面元素控件。但是如果我们想让我们的代码职责更单一,功能划分更清晰,就最好不要用内部类,这时候我们可以借用
Handler 来实现这个需求。
有关 AsyncTask 的用法可以参看我写的这篇博客: http://www.cnblogs.com/ghj1976/archive/2011/05/06/2039204.html
上面就是把 AsyncTask 当作Activity的内部类来使用的。
下面是一个例子,AsyncTask 的子类和 AsyncTask的子类是并行的。
首先是布局文件: main.xml
这里有两个控件,一个是进度条,一个是文本框,这两个在更新进度时都将被更新:
xml version="1.0" encoding="utf-8"?>
<
LinearLayout
xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:orientation
="vertical"
android
:layout_width
="fill_parent"
android
:layout_height
="fill_parent"
>
<
ProgressBar
android
:id
="@+id/progress_bar"
android
:layout_width
="200dip"
android
:layout_height
="200dip"
android
:layout_gravity
="center"
android
:max
="100"
android
:progress
="0"
>
ProgressBar
>
<
TextView
android
:text
="TextView"
android
:id
="@+id/textView1"
android
:layout_width
="wrap_content"
android
:layout_height
="wrap_content"
>
TextView
>
LinearLayout
>
AsyncTask 的子类: AsyncLoader, 注意这里的构造函数, 这是这里的关键之一。
package
ghj1976.AsyncTask;
import
android.os.AsyncTask;
import
android.os.Handler;
// 设置三种类型参数分别为 Params = Void, Progress = Integer,Result = Void
public
class
AsyncLoader extends
AsyncTask {
private
Handler handler = null
;
public
AsyncLoader(Handler h) {
this
.handler = h;
}
@Override
protected
Void doInBackground(Void... params) {
publishProgress(10);
try
{
Thread.sleep(2000);
} catch
(InterruptedException e) {
e.printStackTrace();
}
publishProgress(50);
try
{
Thread.sleep(3000);
} catch
(InterruptedException e) {
e.printStackTrace();
}
publishProgress(100);
return
null
;
}
@Override
protected
void
onPostExecute(Void v) {
this
.handler.sendEmptyMessage(0);
}
@Override
protected
void
onProgressUpdate(Integer... values) {
this
.handler.sendEmptyMessage(values[0]);
}
}
AsyncTaskActivity 代码:
package
ghj1976.AsyncTask;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.view.View;
import
android.widget.ProgressBar;
import
android.widget.TextView;
public
class
AsyncTaskActivity extends
Activity {
public
ProgressBar pBar;
private
TextView tv;
// 主线程的 handler
private
Handler handler = new
Handler() {
public
void
handleMessage(Message msg) {
tv.setText(msg.what + "
");
if
(msg.what <= 0) {
pBar.setVisibility(View.INVISIBLE);
} else
{
pBar.setProgress(msg.what);
}
}
};
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.textView1);
tv.setText("准备开始
");
pBar = (ProgressBar) findViewById(R.id.progress_bar);
// AsyncTask.execute()要在主线程里调用
new
AsyncLoader(handler).execute((Void) null
);
}
}
分享到:
相关推荐
`AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间运行的任务放到后台线程,而将结果更新到主线程,这样可以避免主线程(UI线程)阻塞,提高应用的响应速度。`...
在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...
AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding)错误。在深入探讨 AsyncTask 的...
AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...
`AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...
在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...
- 由于AsyncTask内部维护了一个线程池,大量并发的AsyncTask可能导致性能问题,因此不建议大量使用。 6. **文件结构分析** - `gradlew.bat`和`gradlew`:Gradle wrapper,用于在没有Gradle安装的情况下运行构建。...
这是Pro Android学习系列中AsyncTask部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
1. 创建一个继承自`AsyncTask`的类,例如`LoadDataTask`,并定义所需的泛型参数。 2. 在`onPreExecute()`中,可能需要初始化ListView和Adapter,并显示一个加载提示。 3. `doInBackground()`中,模拟数据生成过程,...
在Android应用开发中,AsyncTask是一个非常重要的工具类,它为开发者提供了一种方便的机制来执行后台操作,同时能够在线程间进行数据交互,确保UI的流畅性。本篇文章将深入探讨Android的AsyncTask异步任务,以及如何...
在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。本实例将探讨如何利用AsyncTask实现断点下载功能,这是一种允许用户在暂停后继续下载大文件的技术,极大...
在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html
在使用`AsyncTask`处理网页下载时,首先创建一个继承自`AsyncTask`的类,然后重写上述方法。下面是一个基本示例: ```java public class DownloadWebPageTask extends AsyncTask, Void, String> { @Override ...
以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap> 其中包含三个异步操作类可供测试
`AsyncTask`是Android提供的一种轻量级的多线程解决方案,它允许开发者在后台执行耗时操作,并在主线程中更新UI,避免了UI阻塞。本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们...
详解Android中AsyncTask的使用。
### Android AsyncTask 详解 #### 一、AsyncTask 概述 `AsyncTask` 是 Android 提供的一个用于执行后台任务的轻量级框架。它能够帮助开发者轻松地在后台线程执行耗时的操作,并且更新 UI 界面而无需直接操作线程和...
AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入探讨这个话题。 首先,Android系统为了解决长时间运行的任务在主线程执行导致的UI冻结问题,提供了AsyncTask。AsyncTask分为三个基本...
在Android应用开发中,AsyncTask是一个非常重要的工具类,它为开发者提供了在UI线程之外执行耗时操作的能力,从而避免了主线程被阻塞导致的ANR(Application Not Responding)错误。这个博文主要围绕Android开发中的...
- **内存泄漏**:如果Activity持有AsyncTask的引用,而AsyncTask内部又持有Activity的引用,会导致Activity无法正常销毁,从而引发内存泄漏。解决方法是在不需要时取消任务或使用弱引用。 - **序列化执行**:默认...