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



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

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

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

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


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


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


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

接下来我们给方法加点料


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


运行的结果是:


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


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


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

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

更多相关文章

  1. Kotlin系列——在Android中使用协程以及协程源码分析
  2. Android蓝牙播放如何显示歌曲信息?
  3. 解锁Retrofit -- 浅析Retrofit源码
  4. Android笔试和面试常见题目(一)
  5. Activity life times——Android
  6. Android使用AIDL设计和调用远程接口
  7. Android(安卓)surfaceflinger (4) -Vsync产生上报流程
  8. Android(安卓)NDK 开发总篇
  9. 针对网上流传的"Android(安卓)再按一次后退键退出应用程序"方法

随机推荐

  1. Android(安卓)圆角矩形ProgressBar
  2. Android(安卓)学习之那些年我们遇到的BUG
  3. Activity 的生命周期
  4. Kotlin for Android使用教程(一)
  5. 电话录音录制双方的声音
  6. 关于Spring for Android
  7. Android跳转到应用商店及常见APP对应包名
  8. ubuntu下搭建ecshop
  9. Android(安卓)读取资源文件下面的文件
  10. Android(安卓)网络提交数据(使用Asynchron