AsyncTask的使用详解

       我们都知道,android从4.0以后不能在主线程中直接访问网络,所以我们必须开启子线程去请求网络资源,并且通过handler发送消息给主线程并且更新UI,但是我们发现每次写这些东西都很麻烦,这时候我们可以用Android给我们提供的AsyncTask来帮我们轻松的实现这些功能,他帮我们免去了开启子线程的操作,并且提供在子线程中实时更新UI的方法,那么现在就开始认识它吧~~~



这里我写了一个很常见的代码,子线程中我用循环模拟了文件的下载,并且每秒发送一个消息给主线程,更新按钮上的文本,那我们用AsyncTask是如何实现的呢?先看以下代码:

在我们声明对象的时候,我们可以看到,要用它需要给他指定三个泛型,这时候我们并不知道这三个泛型有什么作用,但是我们为了区别,我先随便指定三中不同类型

因为这个AsyncTask是一个抽象的类,这个你们自己点进去查看源代码就可以看到,所以这里我new了一个内部类,可以看到,需要实现一个方法doInBackground,顾名思义,这个方法是在后台运行的,也就是说这个方法是在子线程中运行的

我们还可以发现这个方法的参数是一个字符串的可变数组,这是怎么回事?查看源代码!


发现这个方法是一个抽象类,类中的参数是一个参数个数可变的类型Params,那么这个类型是什么类型呢?


发现在类的声明上我们可以看到这个Params的泛型,也就是说这个类型是我们继承这个类的时候指定,继承的时候指定什么类型就是什么类型.


也就是我们new 匿名内部类的时候指定第一个泛型为String类型,所以我们实现的方法中也是String类型的.就是我们自己指定的!

接下来我们给方法加点料


我们也模拟下载一个文件,但是我们少了发送实时更新的消息,我们先运行一下,线程启动用start()方法,而AsyncTask需要使用execute()方法


运行的结果是:


可以看到我们的代码可以正常跑了,这个和我们平常使用的差不多吧?但是注意了,这里我们执行的时候,是可以向方法doInBackground中传递参数的!


这里我传递了一个字符串,为什么是字符串?因为这是我们继承的时候自己指定第一个参数是一个字符串类型的,为了适应更多的情况,Android工程师将它设计成可变的参数,更加灵活的使我们传递更多的参数


可以看到我们可以正常拿到传递过去的数据,但是注意了,取的时候千万要知道可变数组的个数是多少,不然很容易发生下标越界!

请关注我下一篇:AsyncTask的更新UI和处理任务执行的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值