为什么要使用AsyncTask?
在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:
1. 不要阻塞UI线程
2. 确保只在UI线程中访问Android UI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员 。
android提供了几种在其他线程中访问UI线程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤:
每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
转自:http://blog.csdn.net/furongkang/article/details/6998734
分享到:
相关推荐
下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 首先,AsyncTask有三个泛型参数:`Param`, `Progress`, 和 `Result`。它们分别代表异步任务的输入参数类型、任务执行过程中的进度更新类型以及任务完成后...
在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...
AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。...正确理解和使用 AsyncTask,可以帮助开发者更高效地构建用户界面,提升用户体验。
例如,使用ExecutorService创建一个固定大小的线程池,然后通过submit()方法提交AsyncTask实例,返回的Future对象可以用来检查任务状态或者取消任务。 最后,考虑到Android应用的生命周期,我们需要关注AsyncTask与...
这篇博文将深入探讨`AsyncTask`的工作原理和使用方法。 `AsyncTask`主要由四个关键部分组成:`onPreExecute()`、`doInBackground()`、`onProgressUpdate()`和`onPostExecute()`。首先,`onPreExecute()`在UI线程中...
以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap> 其中包含三个异步操作类可供测试
AsyncTask 有四个主要的方法,每个方法都在特定的线程中运行: 1. **onPreExecute()**:在 UI 线程中运行,通常用于任务开始前的准备工作,如显示加载对话框。 2. **doInBackground(Params... params)**:在后台...
AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。 AsyncTask的使用需要设定三个泛型Params、Progress和Result的类型,...
`AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间运行的任务放到后台线程,而将结果更新到主线程,这样可以避免主线程(UI线程)阻塞,提高应用的响应速度。`...
我们需自定义一个`BitmapLruCache`类,继承`LruCache, Bitmap>`,并重写`sizeOf()`方法以计算每个Bitmap的大小。然后在应用启动时实例化并设置给`ImageLoader`,当缓存满时,会自动移除最近最少使用的图片,为新的...
在这个类中,我们需要重写`doInBackground`方法,该方法在后台线程中运行,执行实际的下载任务。同时,可以重写`onPostExecute`方法,这个方法会在UI线程中执行,接收`doInBackground`的结果并显示到界面上。 ```...
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask 2) 实现AsyncTask中定义的下面一个或几个方法 ...
本文将深入探讨`AsyncTask`的`cancel`方法的有效用法以及如何实现强制停止`AsyncTask`异步任务。 ### 1. AsyncTask的基本结构 AsyncTask由三个泛型参数定义:`Params`(输入参数类型)、`Progress`(后台任务进度...
通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...
下面我们将深入探讨AsyncTask的结构、使用方法以及注意事项。 1. **AsyncTask结构**: AsyncTask是一个抽象类,包含三个泛型参数:`Params`(输入参数类型),`Progress`(后台执行过程中的进度类型),`Result`...
AsyncTask是Android开发中用于在后台执行任务并更新UI的工具类,它是Android SDK提供的一种轻量级异步处理机制。在Android应用中,我们经常需要执行一些耗时操作,如网络请求、数据库操作等,但这些操作不能在主线程...
AsyncTask是Android平台中用于在后台执行耗时操作并更新UI的一种工具类。它通过封装线程和Handler,使得开发者可以方便地在后台线程中执行任务,并在UI线程中进行结果处理,从而避免了直接操作UI导致的主线程阻塞...
AsyncTask的典型用法涉及以下几个步骤: 1. onPreExecute(): 这个方法在doInBackground(Params...)之前在UI线程中被调用。它可以用来设置任务的初始状态,比如加载提示等。 2. doInBackground(Params...): 此方法...
在"AsyncTaskDemo"中,我们可以看到具体的实现示例,这可能包括如何创建一个可重用的AsyncTask类,以及如何在实际项目中调用和使用这个类。这个例子可以帮助开发者更好地理解如何在Android应用中有效地利用AsyncTask...