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. 八爪鱼招标网的百度权重升为2了,独立IP也从0快速发展为1000

      自八爪鱼招标网上线以来,本着以客户一切利益为出发点,坚持提供国内首个免费招标信息平台为目标,经过各位同事不断地努力,不断收集客户各种各样的招标.采购实际需求,与政府.事业单位及中小型企业一对一的沟 ...

  2. goldengate abended with no data found

    先来看下报错ggserr.log: 2016-12-22 04:48:52  WARNING OGG-02544  Unhandled error (ORA-26787: The row with k ...

  3. 从零自学Hadoop(04):Linux准备下

    阅读目录 序 搭建环境 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 我们已经准 ...

  4. Android入门笔记(一)

    第一部分,Android开发环境的搭建 1.去http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本jdk并安 ...

  5. #ifndef _LED_H #endif啥意思?

    #ifndef _LED_H#ifndef _LED_H ...... ...... #endif 避免重复引用头文件的内容.

  6. 用修改hosts的方式来屏蔽某些网站

    首先呢,来自知乎的一些问答:修改 hosts 文件可以上一些墙内屏蔽的网站,其原理是什么? (然而通过增/改hosts的方法来FQ已经失效很久了) 然后呢,也可以通过修改hosts来达到屏蔽某些网站的 ...

  7. Maven设置代理服务器

    在setting.xml中设置以下信息即可,请修正对应信息 <proxies> <proxy> <id>optional</id> <active ...

  8. JS入门学习,写一个简单的选项卡

    /* 经过昨天一整天的纠结和摸索.总结下学习初期我最致命的几个问题…… 1.var oDiv = document.getElementById('');    一定要多输,熟悉后o u什么的字母别搞 ...

  9. 三维网格补洞算法(Poisson Method)

    下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...

  10. 360:且用且珍惜!解决虚拟机linux启动缓慢以及ssh端卡顿的问题!

    优化软件以及杀毒软件想必大家都是用过的,小编自用的第一台电脑自带安装的是金山毒霸,随着时间的偏移渐渐用过小红伞,卡巴斯基,优化大师,鲁大师到后来的360优化杀毒套装,优化软件给大家带来了方便,尤其是上 ...