通常情况下,我们要实现异步操作,也就是在子线程进行耗时操作比如下载或者加载图片等,然后在UI(主)线程中更新UI,使用的是Handler和Message来进行异步的实现,但是,谷歌官方在Android系统其实对这种方法进行了封装,这就是AsyncTask。

Handler和Message的使用:http://www.cnblogs.com/Fndroid/p/5098405.html

使用AsyncTask,必须要新建一个类,这个类继承自AsyncTask并且制定传入参数类型、描述过程类型以及返回值类型,这些类型均是泛型

接下来,需要重写一些方法,常用的有以下几个:

onPreExecute():这个方法是在异步加载进行前执行的,通常用来显示一个消息框后者提示

doInBackground():这个方法是在子线程中进行的,所有下载或者加载等耗时的操作,都可以在这里执行

onProgressUpdate():这个方法是在doInBackground方法中执行了publishProgress()方法的时候执行,publishProgress()方法是向此方法传递一些用于描述过程的参数,比如用Integer来描述下载的进度等

onPostExecute():这个方法是在doInBackground()方法执行完毕return之后执行,根据return的类型来判断应该如何更新UI

以上的方法中,只有doInBackground()这个方法是在子线程中执行,其他都是在UI线程,所以可以直接对UI进行更新。

这里我们模拟一个下载,下载完成后更新ListView,如果下载失败就Toast一下

 public class MainActivity extends Activity {

     private Button start;
private ProgressDialog progressDialog;
private ListView mListView;
private SimpleAdapter mAdapter;
private List<Map<String, Object>> mList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.start);
mListView = (ListView) findViewById(R.id.listview);
progressDialog = new ProgressDialog(this); // 构建一个ProgressDialog来提示下载信息
progressDialog.setTitle("正在下载数据");
progressDialog.setMessage("下载中...");
progressDialog.setCancelable(true);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new DownLoad().execute();
}
});
} // 这里定义的一个AsyncTask子类,输入参数类型为空,过程指示参数为整型,异步返回类型为布尔
class DownLoad extends AsyncTask<Void, Integer, Boolean> {
@Override
protected void onPreExecute() {
progressDialog.show(); // 在开始异步下载前,先把ProgressDialog显示出来,提示正在下载
} @Override
protected Boolean doInBackground(Void... params) {
try {
for (int i = 1; i <= 5; i++) { // 每500毫秒执行一次publishProgress,并把参数穿进去
Thread.sleep(500);
publishProgress(i * 20);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Random rd = new Random();
int randomint = rd.nextInt(10);
if (randomint % 2 == 0) { // 生成一个随机数,如果是偶数则return true表示下载成功,奇数表示失败
return true;
} else {
return false;
}
} @Override
protected void onProgressUpdate(Integer... values) {
Log.e("AsyncTask", "progress=" + values[0] + "%"); // 在publishProgress执行后触发,参数的一个数值就是在publishProgress传过来的参数
} @Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
// 判断是否下载成功,成功则更新ListView,失败则Toast一下
if (result) {
mList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 50; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("string", "hello");
mList.add(map);
}
mAdapter = new SimpleAdapter(getApplicationContext(), mList,
android.R.layout.simple_list_item_1,
new String[] { "string" },
new int[] { android.R.id.text1 });
mListView.setAdapter(mAdapter);
} else {
Toast.makeText(getApplicationContext(), "download error!",
Toast.LENGTH_SHORT).show();
}
} } }

显示截图:

      

Log:

可以看到时间是每隔500毫秒,onProgressUpdate()函数就会执行一次。

Android开发学习之路-使用AsyncTask进行异步操作的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  3. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  4. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  5. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  6. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  7. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  8. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  9. Android开发学习之路-记一次CSDN公开课

    今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确. 原话是这样的:点击事件可以通过事件监听和回调两种方法实现. 我一听到之后我的表情是这样的: 这跟我学的看的都不 ...

随机推荐

  1. 本地socket使用AF_UNIX

    int socket(int domain, int type, int protocol); domain参数代表地址族,我们最常用的是TCP/IP协议通信中使用的是AF_INET,在有些情况下建立 ...

  2. DWG2SHP DXF2SHP 如何把AutoCAD的DWG,DXF文件转换为Esri ArcGIS的Shape文件

    dwg是AutoCAD创立的一种图纸保存格式,已经成为二维CAD的标准格式,很多其他CAD为了兼容AutoCAD,也直接使用dwg作为默认工作文件. 地图shape文件由ESRI开发,一个ESRI的s ...

  3. spring自动装配

    spring提供了自动装配(autowiring)和自动检测(autodiscovery)用来减少XML的配置数量. 自动装配bean属性 byName——把与Bean的属性具有相同名字(或ID)的其 ...

  4. [机器学习] 在茫茫人海中发现相似的你:实现局部敏感哈希(LSH)并应用于文档检索

    简介 局部敏感哈希(Locality Sensitive Hasing)是一种近邻搜索模型,由斯坦福大学的Mose Charikar提出.我们用一种随机投影(Random Projection)的方式 ...

  5. 学习django之正则表达式的语法

    正则表达式 正则表达式的常用语法: 1)单个字符: .          任意的一个字符 a|b        字符a或字符b [afg]      a或者f或者g的一个字符 [0-4]      0 ...

  6. linux(centos)源码安装git

    最近使用一个开源库,部署的的时候需要用git克隆依赖库.刚好系统没安装git.就尝试了源码安装git. 源码下载地址:http://codemonkey.org.uk/projects/git-sna ...

  7. 从零开始学IOS开发

    从今天开始开一个坑,由于业务变动,要开始学习IOS开发进行IOS app开发,其实鄙人本身就是一只菜鸟加大学狗,有过两年的C#,ASP.NET MVC,微信公众平台开发经验,一只在继续努力着,从大三下 ...

  8. CSS中继承,特殊性,层叠与重要性

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: <html><head> ...

  9. wireshark常用过滤规则

    wireshark常用过滤规则:(Filter中输入过滤规则)1.源ip过滤:ip.src==1.1.1.1               (过滤源ip为1.1.1.1的包) 2.目的ip过滤:ip.d ...

  10. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...