Android.AsyncTask
来源:互联网 发布:天天特价淘宝网衣服 编辑:程序博客网 时间:2024/05/22 10:35
相信每个Android应用都用到异步操作,或多或少都会将一些耗时的操作分给另外的线程或进程去处理,这样做能保证UI线程不被阻塞,UI交互不会出现无响应,能得到正常的用户体验。
在Android系统中,提供了一个比Thread更好维护的AsyncTask。
AsyncTask是一个abstract class:
public abstract class AsyncTask <Params, Progress, Result> { public static final java.util.concurrent.Executor THREAD_POOL_EXECUTOR; public static final java.util.concurrent.Executor SERIAL_EXECUTOR; public AsyncTask() { /* compiled code */ } public final android.os.AsyncTask.Status getStatus() { /* compiled code */ } protected abstract Result doInBackground(Params... paramses); protected void onPreExecute() { /* compiled code */ } protected void onPostExecute(Result result) { /* compiled code */ } protected void onProgressUpdate(Progress... values) { /* compiled code */ } protected void onCancelled(Result result) { /* compiled code */ } protected void onCancelled() { /* compiled code */ } public final boolean isCancelled() { /* compiled code */ } public final boolean cancel(boolean mayInterruptIfRunning) { /* compiled code */ } public final Result get() throws java.lang.InterruptedException, java.util.concurrent.ExecutionException { /* compiled code */ } public final Result get(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException, java.util.concurrent.ExecutionException, java.util.concurrent.TimeoutException { /* compiled code */ } public final android.os.AsyncTask<Params,Progress,Result> execute(Params... params) { /* compiled code */ } public final android.os.AsyncTask<Params,Progress,Result> executeOnExecutor(java.util.concurrent.Executor exec, Params... params) { /* compiled code */ } public static void execute(java.lang.Runnable runnable) { /* compiled code */ } protected final void publishProgress(Progress... values) { /* compiled code */ } public static enum Status { FINISHED, PENDING, RUNNING; public static android.os.AsyncTask.Status[] values() { /* compiled code */ } public static android.os.AsyncTask.Status valueOf(java.lang.String name) { /* compiled code */ } private Status() { /* compiled code */ } }}
其中的 doInBackground(Params... paramses) 方法就是完成多线程操作的具体入口,把要需要在另一个线程中执行的代码放到这个方法内即可。
执行的状态会分别回调到如下方法中:
onPreExecute()开始执行onPostExecute(Result result)执行完成,这里的Result是在doInBackground中返回的onCancelled() 或onCancelled(Result result)调用cancel(boolean mayInterruptIfRunning)后,
回调到这两个Canceled方法中,
先后顺序是,onCancelled(Result result)->onCancelled()onProgressUpdate(Progress... values)维护进度的方法,在doInBackground中可以调用
publishProgress(Progress... values)来更新进度,
之后回调到此方法中
以上方法都是运行在创建此AsyncTask的线程中,只有doInBackground方法,运行在新线程中。
需要注意的是,启动执行的方法executeOnExecutor,在Android3.0以前的版本中没有此方法,是应为:
Android3.0以前的版本,多个AsyncTask是采用并行执行的;而之后的版本中,调用了execute方法后,所有的AsyncTask是单线程排队进行的,
然而,很多时候需要多个AsyncTask同时进行,所以提供了executeOnExecutor这个方法,采用线程池方式实现多个AsyncTask并行。
这个方法相对之前的execute,多了个Executor参数,来指定多个AsyncTask执行所需的线程池,可以选择AsyncTask提供的两个选项【 SERIAL_EXECUTOR | THREAD_POOL_EXECUTOR 】,当然,也可以自定义一个Executor。
- SERIAL_EXECUTOR 表示单线程排队执行,和调用execute方法效果一样;
- THREAD_POOL_EXECUTOR 表示采用线程池方法执行,可以多个AsyncTask并行。
所以启动AsyncTask的方式需要注意。
如果要取消一个AsyncTask,可以调用cancel(boolean mayInterruptIfRunning)方法,
其中的参数mayInterruptIfRunning表示要不要等待执行体运行完成,
- true 表示不等待执行体运行完成而直接取消,这样执行体中报出异常,然后运行状态立即回调到onCancelled();
- false 表示等待执行体运行完成,然后运行状态再回调到onCancelled();
一般没有特殊需求,应该采用false。
0 0
- Android asyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android asyncTask .
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask !!!!
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- WPF报表控件(折线图、柱状图、饼状图)
- 我的android(第八天)
- 【黑马程序员】C语言学习笔记之错题集
- flex编程之基础搭建
- Unity中基于高度图的地形系统总结
- Android.AsyncTask
- Linux 搭建SVN 服务器
- 如何在ios中简便地判断内存是否泄露
- ngx_event_pipe_write_to_downstream分析
- 团队建设的几点体会-----之二
- poj1700过河问题(贪心)
- LDO和BUCK降压稳压器对比
- Android - 组件工具箱(widget tool box)
- 监控宝监控服务性能监控都包括哪些指标?