Android异步操作 AsyncTask

首先为什么要进行异步操作呢?主要是因为会有线程的阻塞,阻塞会带来不好的用户体验。那什么叫做异步操作呢?就是两块任务同时执行,相互之间并不干扰。


在Android中除了使用Thread+Handler可以实现多线程之外,还可以使用一个专门封装的类AsynTask来实现。

这里干脆再说说为什么要使用异步操作吧。

假如你在手机上运行一个程序,看到一张图片想下载下来,要大概5-10秒的时间,刚下载着,突然又想点击另外一个东西,这时候你点击就没有相响应了,因为线程被占用着,要等到下载结束你的点击才生效。这个叫做线程的阻塞。这种情况当然不是用户想要的,理想的情况应该是边下图片边干其它的,互不干扰。

怎么实现这种情况呢?多线程。

Android提供了一个叫做AsynTask的类,可以新建一个类来继承这个类,就像如下代码:

public class AsynSleepextends AsyncTask<Void, Void,Void>{  //三个Void都是大写的V

然后复写doInBackground方法,里面想干啥就干啥。

@Override

protected Void doInBackground(Void... params) {

Sleep sleepFiveSeconds = new Sleep();

sleepFiveSeconds.sleepFive();

return null;

}

}

在其它的Activity的线程中,定义一个AsynSleep类的对象,然后不是调用doInBackground方法,而是调用excute()方法,直接这样就行。

其实这样就是相当于java里面的多线程,只不过android对多线程有了自己的一些封装,这样用起来更加方便,主要还是对于ui的操作,解决ui线程阻塞的问题。

AsyncTask<Void, Void, Void>里面的3个Void分别是doInBackground,onProgressUpdate,onPostExcute三个函数的参数,其中第三个也是doInBackground的返回值类型,因为该方法返回的值就是onPostExcute的参数值。


就是说,这样一个类中,通常需要复写的有5个方法,当在ui线程中定义该类的对象并执行execute方法以后,第一个执行的是onPreExcute()方法,通常可以在里面设定一个比如文本值,开始怎么怎么样了,然后就会执行doInBackground()方法,这个方法是最主要的执行方法,它的参数是类的第一个参数,里面执行耗时较长的一些操作,比如更新进度,但是它自己是不能执行更新ui的。然后使用publishProgress(inti)方法,只要这个方法一被调用,就会触发onProgressUpdate()方法,而这个方法是在ui线程里面执行的,这样的话在onProgressUpdate()就能根据这个progress更新进度条,在doInBackground执行完毕以后,返回一个值,这个值就会传给onPostExcute()方法,这个方法也运行在ui线程中,可对ui进行操作。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值