安卓中AsyncTask的基本使用

  • 使用场景介绍

在安卓开发中,我们经常需要访问互联网资源,这些访问是都需要在后台线程中去完成的,因为安卓的UI线程不允许执行耗时任务。然而,后台线程是不可以修改安卓的UI的,所以我们一般使用Handler去修改UI,这需要我们自己去创建新的线程。其实安卓中已经给我们提供好了一个AsyncTask类,这个类就用用来处理耗时任务的,所以我们使用这个类也可以完成同样的操作。

  • AsyncTask类介绍

AsyncTask是一个抽象类,我们需要继承这个类。这个类需要指定三个泛型参数,第一个指:我们启动任务时要传递的参数类型,第二个指:任务进度改变时返回的数据类型,第三个指:任务完成时返回的数据类型。并且我们一般都会实现其中的四个方法,如下:(其中doInBackground方法是必须实现的)

public class MyAsyncTask extends AsyncTask<String, Integer, String> {

    @Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
     return null;
} @Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
} @Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
} @Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}

这四个方法都是系统自动回调的,不需要用户手动调用,用户在使用这个类的时候如下:

MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();

其中,execute()方法可以传递多个参数,参数的数目是任意的,类型则是第一个泛型指定的类型,(这里指定的是String)在doInBackground方法中,获取参数的形式为:params[0], params[1]...的形式。当用户调用execute()方法之后,系统便会回调doInBackground方法(注意,在此之前,系统先调用onPreExecute方法,用户可以根据自己的需要初始化一些其他的数据或UI)。任务完成之后,系统回调onPostExecute方法,返回值类型则是我们在第三个泛型指定。那么onProgressUpdate方法什么时候调用呢?也就是任务有了新的进度,在doInBackground方法中调用publishProgress(),系统就可以回调该方法,其中传递的参数也是任意个,类型则是第二个泛型指定的类型。到此,AsyncTask类的基本介绍就结束。

  • 取消任务

如果遇到需要取消任务的情况,怎么办呢?后台任务是无法直接结束掉的,我们可以调用myAsyncTask.cancel(true);这样只是把这个后台线程的状态改为了cancel,线程本身并没有停止,仅仅改变了他的状态,所以我们需要在doInBackground方法中判断线程的状态,如果是cancel,则直接return或break即可。

    @Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
if (isCancelled()) {
return null;
}
// 处理其他任务
return "Data";
}
  • 补充
  1. 必须在UI线程中创建AsyncTask的实例;
  2. 必须在UI线程中调用execute()方法;
  3. 重写的四个方法都是自动调用的,不用手动去调用;
  4. 每个AsyncTask只能被执行一次,多次执行则会发生异常;

安卓中AsyncTask的基本使用的更多相关文章

  1. 【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果

    在前面的[安卓缓存策略系列]安卓缓存之内存缓存LruCache和[安卓缓存策略系列]安卓缓存策略之磁盘缓存DiskLruCache这两篇博客中已经将安卓中的缓存策略的理论知识进行过详细讲解,还没看过这 ...

  2. 安卓中的消息循环机制Handler及Looper详解

    我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handl ...

  3. 安卓中的Model-View-Presenter模式介绍

    转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...

  4. 安卓中的数据存储方式以及ContentProvider的简单介绍

    1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储   2.请介绍下ContentPr ...

  5. 转-安卓中实现两端对齐,中间fill_parent的方法

    安卓中实现两端对齐,中间fill_parent的方法 Java代码:   <?xml version="1.0″ encoding="utf-8″?> <Line ...

  6. 支持在安卓中UI(View)的刷新功能

     这是一款可以支持在安卓中UI(View)的刷新功能,Android中对View的更新有很多种方式,使用时要区分不同的应用场合.我感觉最要紧的是分清:多线程和双缓冲的使用情况.   现在可以尝试理解下 ...

  7. 分享一个安卓中异步获取网络图片并自适应大小的第三方程序(来自github)

    安卓中获取网络图片,生成缓存 用安卓手机,因为手机流量的限制,所以我们在做应用时,要尽量为用户考虑,尽量少耗点用户的流量,而在应用中网络图片的显示无疑是消耗流量最大的,所以我们可以采取压缩图片或者将图 ...

  8. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  9. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

随机推荐

  1. 五. Jmeter--HTTP Cookie Manager

    1. 添加HTTP Cookie Manager 2.添加登录login http,request info 和 HTTP Header Manager 中的信息是从fiddler中拿的, 至于hea ...

  2. BBScan — 一个信息泄漏批量扫描脚本

    github:https://github.com/lijiejie/BBScan 有些朋友手上有几十万甚至上百万个域名,比如,乌云所有厂商的子域名. 如果把这30万个域名全部扔给wvs,APPsca ...

  3. 用C#实现通过串口对设备的数据采集--Server层

    今天中午没睡午觉,头昏眼花的,实在写不了代码,把这几天写的Server层数据采集的程序整理了一下. WatrLevelDataCollectServer.cs using System; using ...

  4. MySQL-索引工作原理及使用注意事项

    1.为什么需要索引(Why is it needed)? 当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表 ...

  5. First Missing Positive——数学类

    转:http://blog.csdn.net/nanjunxiao/article/details/12973173 Given an unsorted integer array, find the ...

  6. nodeJs 常用模块(一)

    url url.parse() querystring querystring.parse( [string] , [分隔符] )  ,解析为js字面量 querystring.stringify() ...

  7. Hilite代码高亮工具

    在用<有道云笔记>等软件时候,软件自身不提供代码高亮功能,对于需要记录code的学习笔记,视觉效果丢失. 有很多在线工具能用来代码高亮,比如oschina就有代码高亮页面用于着色. 但是我 ...

  8. 【C#日期系列(一)】--C#获取某月第一天0分0秒以及最后一天59分59秒

    工作中可能会遇到很多不常见的需求,比如这次需要获取某个月的第一天和最后一天 #region 取得某月的第一天0分0秒 /// <summary> /// 取得某月的第一天0分0秒 /// ...

  9. 面试的65个回答技巧-适用于BAT公司

    互联网职业群分享的资料,里面大多是BAT公司的人,很多是猎头.这些技巧对于职场人来说,是非常宝贵的. 1.请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验 ...

  10. python沙盒逃逸

    前言 最近遇到了很多python沙盒逃逸的题目(不知道是不是因为现在python搭的站多了--),实际使用时发现只会复制别人的payload是不够用的,于是自己来总结一波(顺带一提python沙盒逃逸 ...