Android AsyncTask
AsyncTask类任务管理:
内部会创建一个进程作用域的线程池来管理要运行的任务,也就就是说当你调用了AsyncTask#execute()后,AsyncTask会把任务交给线程池,由线程池来管理创建Thread和运行Therad。
3.0以后的AsyncTask类加载方法:
//按先后顺序每次只运行一个
private static ExecutorService SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor(); //自定义的CorePoolSize为7的线程池,允许7个线程同时运行
private static ExecutorService LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(7); //未设限制,全部执行
private static ExecutorService FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool(); //提供自定义的线程池来运行和调度Thread
task.executeOnExecutor(SINGLE_TASK_EXECUTOR);
//task.executeOnExecutor(LIMITED_TASK_EXECUTOR);
//task.executeOnExecutor(FULL_TASK_EXECUTOR);
使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建;
2) execute方法必须在UI thread中调用;
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
4) 不能在doInBackground(Params... params)中更改UI组件的信息。
5) 该task只能被执行一次,否则多次调用时将会出现异常;
private CustomTask mTask;
@Override
public void onClick(View v) {
//注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常
mTask = new Custom();
mTask.execute("http://www.baidu.com");
}
自定义AsyncTask:
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。
 private class CustomTask extends AsyncTask<String, Integer, String> {
         //onPreExecute方法用于在执行后台任务前做一些UI操作
         @Override
         protected void onPreExecute() {
             textView.setText("loading...");
         } 
         //doInBackground方法内部执行后台任务,不可在此方法内修改UI
         @Override
         protected String doInBackground(String... params) {
             try {
                     for (int count = 0; count < 10; count ++) {
                         //调用publishProgress方法公布进度,触发onProgressUpdate方法,从而对UI进行修改
                         publishProgress((int) ((count / (float) total) * 100));
                         //休眠500毫秒
                         Thread.sleep(500);
                     }
                     return new String("success");
             } catch (Exception e) {
                 Log.e(TAG, e.getMessage());
             }
             return null;
         }  
         //onProgressUpdate方法用于更新进度信息
         @Override
         protected void onProgressUpdate(Integer... progresses) {
             progressBar.setProgress(progresses[0]);
             textView.setText("loading..." + progresses[0] + "%");
         } 
         //onPostExecute方法用于在执行完后台任务后更新UI,显示结果
         @Override
         protected void onPostExecute(String result) {
             textView.setText(result);
         }  
         //onCancelled方法用于在取消执行中的任务时更改UI
         @Override
         protected void onCancelled() {
             textView.setText("cancelled");
             progressBar.setProgress(0);
         }
     }  
当需要停止任务时:
@Override
public void onClick(View v) {
//取消一个正在执行的任务,onCancelled方法将会被调用
mTask.cancel(true);
}
Android AsyncTask的更多相关文章
- android AsyncTask介绍(转)
		android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ... 
- Android AsyncTask异步加载WebAPI
		之前做的程序一直存在很多问题,因为需要加载的Activity需要从网络加载数据.并没有完全正确的使用异步的方法去加载! 之前用的虽然是AsyncTask,但是在加载完成的时候还是并没有使用AsyncT ... 
- Android -- AsyncTask 使用和缺陷
		一.AsyncTask的基本用法 由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它.在继承时我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下: ... 
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
		前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ... 
- android AsyncTask介绍
		AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主 ... 
- Android AsyncTask分析
		---恢复内容开始--- 因为android的UI线程是不安全的,如果你UI线程里执行一些耗时任务,很容易就导致程序崩溃.并且目前网络任务也不能够在UI线程里执行.处理这些问题除了直接写一个线程以外, ... 
- Android AsyncTask异步任务(二)
		之前我们讲过了AsyncTask 的生命周期(onPreExecute-->doInBackground-->onProgressUpdate-->onPostExecute),今天 ... 
- Android --AsyncTask异步任务(一)
		1.为什么要异步任务 Android单线程模式 耗时操作放在非主线程(UI线程)中执行 我们都知道Android是单线程模式,只有主线程才能对UI操作,简称UI线程.当然这样的好处是:保证UI的稳定性 ... 
- Android AsyncTask 简单用法
		简介 AsyncTask 是一个轻量级的异步处理类.使用是需继承自该类.可以方便的执行异步任务并且在将进度显示在UI上. 注意事项 AsyncTask只适合处理轻量级的任务即耗时几秒或者几十秒的任务. ... 
- Android AsyncTask 源码解析
		1. 官方介绍 public abstract class AsyncTask extends Object java.lang.Object ↳ android.os.AsyncTask&l ... 
随机推荐
- Enter password for default keyring to unlock
			file /home/ok/.gnome2/keyrings/login.keyring /home/ok/.gnome2/keyrings/login.keyring: GNOME keyring, ... 
- 验证码的种类与实现  C#封装类  - .NET MVC WEBFORM
			验证码方式 1.随机字母或者数字,纯文本验证码 这种非常容易破解 ,市场上有大量的现成接口或者工具,背景越复杂难度越高. 2.题库验证码 要破解这种验证码,需要人工收集题库才可以破解,可以免疫不是专门 ... 
- ***LINUX添加PHP环境变量:CentOS下将php和mysql命令加入到环境变量中
			CentOS系统下如何将PHP和mysql命令加入到环境变量中,在Linux CentOS系统上 安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到 ... 
- Pyqt  QListWidget 展示系统环境变量
			今天学习了下Pyqt的 QListWidget 控件 我们先看下这个图片 这张图片就是典型的listWidget效果,我们今天就仿这样布局新建个ListWidget 在网上找了个关于QListWidg ... 
- maven File encoding has not been set
			原pom.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ... 
- [Linux] 学习笔记之安装学习环境(sshd, lrzsz)
			紧接前一篇,在VMWare安装完Linux,这个时候我们要使用远程工具连接到虚拟机上去了,以前一直使用Putty,后来到新公司之后,推荐使用SecureCRT,使用之后,觉得效果不错,但是每次连接都失 ... 
- webrtc中的带宽自适应算法
			转自:http://www.xuebuyuan.com/1248366.html webrtc中的带宽自适应算法分为两种: 1, 发端带宽控制, 原理是由rtcp中的丢包统计来动态的增加或减少带宽,在 ... 
- hihocoder #1333 : 平衡树·Splay2
			描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙管理一下团队的人员,但是感觉好难啊. 小Hi:说来听听? 小Ho:事情是这样的.我们有一个运动同好会 ... 
- struts2框架快速入门小案例
			struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ... 
- EL表达式详解及应用实例
			1. EL是JSP内置的表达式语言! * jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本! * EL替代的是<%= ... %>,也就是说,EL只 ... 
