AsyncTask使用详解

AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。AsyncTask类的声明如下:

public abstract class AsyncTask<Params, Progress, Result> 
  •  

我们可以看到,AsyncTask是一个泛型类,它的三个类型参数的含义如下:

Params:doInBackground方法的参数类型;
Progress:AsyncTask所执行的后台任务的进度类型;
Result:后台任务的返回结果类型。
  •  

我们再来看一下AsyncTask类主要为我们提供了哪些方法:

onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作 
doInBackground(Params… params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法) 
onProgressUpdate(Progress… values) //由publishProgress内部调用,表示任务进度更新 
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果 
onCancelled() //此方法会在后台任务被取消时被调用

以上方法中,除了doInBackground方法由AsyncTask内部线程池执行外,其余方法均在主线程中执行。

2. AsyncTask的局限性

AsyncTask的优点在于执行完后台任务后可以很方便的更新UI,然而使用它存在着诸多的限制。先抛开内存泄漏问题,使用AsyncTask主要存在以下局限性:

在Android 4.1版本之前,AsyncTask类必须在主线程中加载,这意味着对AsyncTask类的第一次访问必须发生在主线程中;在Android 4.1以及以上版本则不存在这一限制,因为ActivityThread(代表了主线程)的main方法中会自动加载AsyncTask 
AsyncTask对象必须在主线程中创建 
AsyncTask对象的execute方法必须在主线程中调用 
一个AsyncTask对象只能调用一次execute方法

 

使用例子及说明:

    class MyAsyncTask extends AsyncTask<String,Integer,String> {@Overrideprotected void onPreExecute() {super.onPreExecute();Log.i("lgq","sss=s===onPreExecute==");}@Overrideprotected void onCancelled() {//取消该线程方法     myAsyncTask.cancel(false);super.onCancelled();Log.i("lgq","sss=s===onCancelledddd==");}@Overrideprotected void onProgressUpdate(Integer... values) {//进度条回调方法super.onProgressUpdate(values);//通过publishProgress方法传过来的值进行进度条的更新.
//            progressBar.setProgress(values[0]);Log.i("lgq","sss=s====="+values[0]);}@Overrideprotected void onPostExecute(String aVoid) {//doInBackground结果回调方法super.onPostExecute(aVoid);Log.i("lgq","........"+aVoid);}@Overrideprotected String doInBackground(String... params) {//参数类型是AsyncTask最后一个参数类型//使用for循环来模拟进度条的进度.for (int i = 0;i < 100; i ++){//调用publishProgress方法将自动触发onProgressUpdate方法来进行进度条的更新.
//                ab++;publishProgress(i);//加载进度条方法try {//通过线程休眠模拟耗时操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}return params[0];}}

启动AsyncTask

 

MyAsyncTask myAsyncTask;
myAsyncTask  = new MyAsyncTask();
myAsyncTask.execute("ssssw232e3");//这个参数会传递到doInBackground里面

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表

在使用的时候,对于test(String…strings),你可以直接用test()去调用,标示没有参数,也可以用去test(“aaa”),也可以用test(new String[]{“aaa”,”bbb”})。

 doInBackground(String... params),onProgressUpdate(Integer... values)参数都是数组类型

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# linq的差集,并集,交集,去重【转】

using System.Linq;List<string> ListA new List<string>(); List<string> ListB new List<string>(); List<string> ListResult new List<string>();ListResult ListA.Distinct().ToList();//去重 ListResult ListA.Except(ListB).T…

HttpURLConnection, Android访问网络,实用demo

常量 private static final String CHARSET "UTF-8"; private static final String HTTP_METHOD_POST "POST"; private static final String PARAMETER_KEY_REN_CODE "renCode"; 1、使用AsyTask访问网络 class MyAsyncTask extends AsyncTask…

vscode设置折行字数

在vscode设置中查找Word Wrap。 将默认的80换成200 即可。

nuxt引用static或者assets目录下资源注意事项

Nuxt 服务器启动后&#xff0c;会将static文件目录映射到根路径/下。 所以想引用static目录下图片&#xff0c;直接写法如下 <img src"/log.png"/>引用assets目录下文件&#xff0c;写法如下 <img src"~/assets/logo.png"/>

SpringCloud stream连接RabbitMQ收发信息

百度上查的大部分都是一些很简单的单消费者或者单生产者的例子&#xff0c;并且多是同一个服务器的配置&#xff0c;本文的例子为多服务器配置下的消费生产和消费者配置。 参考资料&#xff1a;https://docs.spring.io/spring-cloud-stream/docs/Elmhurst.RELEASE/reference/ht…

前端学习(2659):组件间传参

第一步 第二步 第三步 子组件定义 第四步

Android 生成随机数,获取一条随机字符串

public String makeCheckCode() {StringBuffer sb new StringBuffer();for (int i 0; i < 5; i) {int temp (int) (Math.random() * 10);sb.append(temp);}return sb.toString(); } final int duration new Random().nextInt(60) * 1000; /*获取一条随机字符串*/ p…

腾讯地图 添加事件和移除事件

见官方文档&#xff1a;https://lbs.qq.com/javascript_v2/guide-event.html var listener qq.maps.event.addListener(map,click,function() {alert(您点击了地图。);} ); //移除 click 事件. qq.maps.event.removeListener(listener);

java.lang.ArithmeticException: divide by zero

除数不能为零&#xff0c;请务必检查代码是否有机会出现除数为零的情况

腾讯地图 marker 从地图上清空

腾讯地图marker有一个方法setMap&#xff0c;使用这个方法&#xff0c;可以设置marker所在的地图&#xff0c;只要把所在地图设置为null&#xff0c;就相当于清空了。 marker.setMap(null)官方参考文档&#xff1a;https://lbs.qq.com/javascript_v2/case-run.html#sample-rem…

Android 实现验证码效果图

自定义验证码图片view public class CheckView extends View {Context mContext;String mCheckCode null;Paint mTempPaint new Paint();private final int mPointNum;private final int mLineNum;private int mTextLength;private final float mTextSize; // private f…

腾讯地图 qq.map 设置鼠标样式

腾讯地图设施鼠标样式我暂时没有找到直接的方法&#xff0c;但是它有一个属性可以控制draggableCursor,draggingCursor。直接修改地图实例的属性&#xff0c;就可以实现修改样式。 官方参考文章&#xff1a;http://open.map.qq.com/javascript_v2/doc/mapoptions.html 我的代…

pandas学习笔记——阅读官方文档

1. 初始化 &#xff08;1&#xff09;生成简单序列pd.Series >>>s pd.Series([1,3,5,np.nan,6,8]) >>>s 0 1.0 1 3.0 2 5.0 3 NaN #注意空 4 6.0 5 8.0 dtype: float64 &#xff08;2&#xff09;生成日期序列pd.date_range >>&g…

Android 抖动提示动画

左右抖动ObjectAnimator animator ObjectAnimator.ofFloat(textView, "translationX", 0, 100, -100,0); animator.setDuration(200); animator.start(); 重复左右抖动 Animation translateAnimation new TranslateAnimation(-20, 20, 0, 0); translateAnimation.…

工作173:数组转换为对象

var fruits [“banana”, “apple”, “orange”, “watermelon”]; var fruitsObj { …fruits }; console.log(fruitsObj);// returns {0: “banana”, 1: “apple”, 2: “orange”, 3: “watermelon”,4: “apple”, 5: “orange”, 6: “grape”, 7: “apple”}

文件树的功能整理

我的需求是实现一个文件树&#xff0c;需要对原始数据结构进行处理&#xff0c;返回前端需要的数据。 1、mongodb数据库中存放的原始数据&#xff1a; let fData [{"pid": null,"_id": "5e847c7f11228f1e88095dda","name": "公…