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


在Android中除了使用Thread+Handler可以实现多线程之外,还可以使用一个专门封装的类AsynTask来实现。
这里干脆再说说为什么要使用异步操作吧。
假如你在手机上运行一个程序,看到一张图片想下载下来,要大概5-10秒的时间,刚下载着,突然又想点击另外一个东西,这时候你点击就没有相响应了,因为线程被占用着,要等到下载结束你的点击才生效。这个叫做线程的阻塞。这种情况当然不是用户想要的,理想的情况应该是边下图片边干其它的,互不干扰。
怎么实现这种情况呢?多线程。
Android提供了一个叫做AsynTask的类,可以新建一个类来继承这个类,就像如下代码:

public class AsynSleepextends AsyncTask{  //三个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里面的3个Void分别是doInBackground,onProgressUpdate,onPostExcute三个函数的参数,其中第三个也是doInBackground的返回值类型,因为该方法返回的值就是onPostExcute的参数值。


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




更多相关文章

  1. Android读取应用列表权限漏洞
  2. 增加改查――android数据库篇二
  3. 一个简单的Android破解WIFI密码的方法(实用)
  4. (二)Unity 与 Android的布局管理
  5. 剖析Android中进程与线程调度之nice
  6. 我的android 第13天 -SQLiteOpenHelper对数据库进行版本管理
  7. Android上访问Java做的WebService获取JSON数据的方法及org.xmlpu
  8. Android中使用ps命令查看进程PID
  9. AndroidStudio快捷键和使用相关

随机推荐

  1. Android中Intent传递对象的两种方法(Seri
  2. android初始化activity时隐藏软键盘
  3. Android中判断网络连接是否可用
  4. Eclipse中跟踪调试Android(安卓)Framewor
  5. android EditText控件如何禁止输入内容
  6. android驱动之虚拟按键
  7. android流式布局、待办事项应用、贝塞尔
  8. Android开发者指南(1) —— Android(安卓
  9. ionic打包apk的时候Android(安卓)API版本
  10. Android获取当前已连接的wifi信号强度的