关闭

异步任务AsyncTask

38人阅读 评论(0) 收藏 举报

强调!!!以下只是我个人看法,如有错误的地方请文明指出微笑,如有其他看法请耐心讨论微笑,如有看不懂可以参考其他有关博客微笑,最后如有想喷的出门左转不谢。微笑

Android的主线程即UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件等,因此开发者的其他操作不应该、也不能阻塞主线程,否则主线程将会变得停止响应。一般如果主线程阻塞超过5秒就会引发ANR(Application Not Responding)无响应异常。

为避免主线程失去响应问题,Android建议将耗时操作放在新的线程中,但是新的线程可能需要动态的更新UI组件,比如需要从网上获取一个网页,让后在TextView上将其源代码显示出来,此时就要连接网络、获取网络数据的操作放在新线程中完成。问题是获取网络数据后,新线程不允许直接更新UI组件,有如下解决方法:

1、使用Handler实现线程之间的通信。

2、Activity.runOnUiThread(Runnable).

3、View.post(Runnable).

4、View.postDelayed(Runnable,long).

后三种较繁琐,但是异步任务则可以进一步简化这种操作。它不需要借助线程和Handler即可实现。

   publicabstractclassAsyncTask<Params,Progress,Result>

  • Params 第一个参数:输入参数 是doInbackground()方法的参数类型
  • Progress 第二个参数:进度值 onProgressUpdate()方法的参数类型 ;主要用来反映进度值 ,如果不需要 可设置为Void
  • Result 第三个参数:结果类型 doInbackground()方法的的返回值类型 也是 doPostExecute()的参数类型
异步任务的执行原理:


  • execute() 在主线程调用 用来启动 异步任务 ,一定要在主线程调用哦
  • onPreExecute() 在execute()执行后立即执行此方法 一般在执行后台任务前对一些UI进行标记 对后台数据进行处理
  • doInbackground() 在 onPreExecute()执行后 立即执行此方法 参数是 execute()方法 的参数 会传入到这里,主要在里进行一些耗时的操作,可以使用publishProgress()来跟新进度 返回值就是后台任务的返回结果,
  • onProgressUpdate() 在 doInbackground 中调用publishProgress才会执行 ,不调用就不会执行 是传入进度值 在界面显示进度
  • onPostExecute() 在doInbackground()执行完毕后调用 参数时 doInbackground的返回结果 ,在这里对结果进行处理显示到UI控件中
  • cancel() 取消任务 ,这个手动调用哦
注意事项:

  • execute() 必须在UI主线程中调用
  • 不能在 doInbackground()中进行有关于 UI的操作
  • 除了 execute方法可以手动调用 ,其他方法都不能手动调用
  • 一个AsyncTask 任务实例只能执行一次 ,第二次就会报错
关于取消任务cancel(true)

在取消任务时 如果任务正在执行 (doInbackground()方法正在运行) 时取消 不会影响 doInbackground方法的执行
只是不会调用doPostExecute()方法而已 ,而且就算调用了publishProgress方法 onProgressUpdate也不会执行了,
所以 不是真正的取消操作 ,只是取消了 在UI主线程的操作,不调用onPostExecute()和onProgressUpdate()方法;

正确取消姿势:在doInbackground中加判断代码

if(isCancelled()){

//如果取消了任务 就不执行

     return null;

}

取消任务的代码:

if(myAsync != null && myAsync.getStatus() == AsyncTask.Status.RUNNING){

    myAsync.cancel(true);

}

总之,使用异步任务只要三步即可:

1、创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,则可将它指定为void。

2、根据需要实现AsyncTask的方法。

3、调用AsyncTask子类的实例的execute(Params ..params)开始执行耗时任务。

小例子(使用异步任务执行下载):













0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:411次
    • 积分:61
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档