AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:

onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:

Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;

下面我写的一个AsyncTask简单例子:

 public class MainActivity extends Activity implements View.OnClickListener {

     private static final String TAG = MainActivity.class.getSimpleName();
private Button mButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} public void initView(){
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(this);
} @Override
public void onClick(View view) {
if (view == mButton){
// 保证AsyncTask在Android 3.0以上版本并行
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
Log.v(TAG,"BUILD11111");
new NewAsyncTask("AsyncTask#1111").
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
new NewAsyncTask("AsyncTask#2222").
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
new NewAsyncTask("AsyncTask#3333").
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
new NewAsyncTask("AsyncTask#4444").
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
new NewAsyncTask("AsyncTask#5555").
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
Log.v(TAG,"BUILD22222");
}
} } private static class NewAsyncTask extends AsyncTask<String, Integer, String>{
private String mName = "AsyncTask";
public NewAsyncTask(String name){
super();
mName = name;
}
@Override
protected String doInBackground(String... strings) {
try{
Log.v(TAG,"doInBackground====");
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
return mName;
} @Override
protected void onPostExecute(String result){
super.onPostExecute(result);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Log.v(TAG, result + "execute finish at" + df.format(new Date()));
}
}
}

运行效果:

最后总结一下:

Asynctask默认支持可并发任务数量是5个,使用AsyncTask,你要做的是继承父类,然后重写doInBackground(Params...),在里面实现后台操作,如果有返回结果的话,重写onPostExecute(Result),然后处理后台程序的结果。
如果需要更新进度的话,在onPreExecute()里实例化进度条(也可以不在这),之后在doInBackground(Params...)里面用publishProgress()发布进度值,然后重写onProgressUpdate(Progress...)接收onPreExecute()发布的结果,并添加更新进度条的代码。

6.初探Asynctask的更多相关文章

  1. Android异步载入全解析之使用AsyncTask

    Android异步载入全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理.更能够提高他们运行的效率.优化整个App.当然我们能够自己 ...

  2. Android AsyncTask 初探

    因为在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确 ...

  3. Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案

    一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...

  4. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  5. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  6. Android笔记——AsyncTask介绍

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  7. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  8. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  9. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

随机推荐

  1. Shou 团队诚意满满的招募 Swifter

    一.团队介绍 团队产品 VPlayer 播放器靠自增长 3 年内获得全球 4000 万用户,开发的 Vitamio 组件更是获得微博.UC.金山等知名企业授权使用.—— 团队再次起航,经历一年多我们已 ...

  2. 处理Xcode 警告

    除了代码中我们手动加入的 #Waring  标示 所产生的警告,我们都应该重视.下面是一些警告的处理. 1,方法过期,或 使用新的api  替换方案 multipartFormRequestWithM ...

  3. 关于UIView布局的总结

    总结一下布局UIView 1.Laying out Subviews(布局子视图) 系统提供了相关的三个api - (void) layoutSubviews 在IOS5.1和之前的版本,此方法的缺省 ...

  4. 转载文档:Storm实战常见问题及解决方案

    该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...

  5. Linux配置环境报“/usr/local/develop-tools/apache-maven-3.3.9/bin: 是一个目录“的解决方案

    安装Maven中 配置系统环境变量: # vi + profile M2_HOME=/usr/local/develop-tools/apache-maven- export M2_HOME PATH ...

  6. sql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

  7. JVM之运行时常量池(Runtime Constant Pool)

    基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字 ...

  8. 【Linux学习】如何了解一个陌生的命令?

    如何了解一个陌生的命令? 有一些命令可以用来了解某个命令本身的情况,比如这个命令的绝对路径. $which ls which 在默认路径中搜索命令,返回该命令的绝对路径. $whereis ls wh ...

  9. AP是什么

    百度链接: AP---http://baike.baidu.com/link?url=_mC-Wkgl8j1_awpuicoZk3i4MWVcLaio1nm9XRt60F9QD4V_lJ-kE7J4C ...

  10. android 尽量不要使用static静态变量

    使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静 ...