异步任务AsyncTask

原创 2016年08月28日 21:26:26

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

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)开始执行耗时任务。

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













AsyncTask异步任务类

AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部封装了Handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使Asy...
  • littlewhitetree
  • littlewhitetree
  • 2016年07月18日 20:49
  • 1076

Android之AsyncTask异步任务——防止内存泄露

Android的异步任务有很多实现方法,最常见的如Handler、Thread、AsyncTask;还有一些开源项目也可以做到异步任务和线程间通信等功能,例如:EventBus、RxAndroid等,...
  • zsf442553199
  • zsf442553199
  • 2016年07月25日 11:20
  • 554

android中异步任务AsyncTask的应用和工作原理

android4.0之后,android不允许在UI线程(主线程)中运行其他耗时线程,如网络请求的线程,否则就会崩溃抛出NetWorkOnMainThreadException 而且将耗时线程放入主线...
  • yxb_yingu
  • yxb_yingu
  • 2016年05月31日 18:55
  • 1206

Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解

AsyncTask生来就是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从编程的语法上显得优雅了许多,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。Android官网总结...
  • qq_22118507
  • qq_22118507
  • 2016年05月18日 10:16
  • 1240

Android之AsyncTask异步任务

1      AsyncTask异步任务 1.1    ANR的概念          Application Not Responding,应用程序无响应          Android系统...
  • JourneyX
  • JourneyX
  • 2016年10月30日 10:04
  • 1099

Android中AsyncTask(异步任务)详解

1、   Android中的单线程模型 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏...
  • u012468376
  • u012468376
  • 2016年02月21日 15:40
  • 5788

安卓异步任务类AsyncTask——突出一个简单、好用

前言:AsyncTask是android提供的轻量级异步任务类(代码轻量级,系统资源占用并不是轻量级!),完整的封装了异步任务流程,这让我想起了Handler异步任务通信机制。两者对比起来,Async...
  • JerryCQU
  • JerryCQU
  • 2015年10月23日 09:38
  • 1176

Android中异步任务机制AsyncTask的理解

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界...
  • lplj717
  • lplj717
  • 2015年10月16日 14:20
  • 1190

Android 异步任务AsyncTask,执行下载任务

AsyncTask 是一个抽象类,通常用于被继承,继承 AsyncTask 时需要指定如下三个泛型参数。         Params :启动任务执行的输入参数的类型。         Progr...
  • liuwan1992
  • liuwan1992
  • 2016年10月17日 14:02
  • 4587

Android消息处理机制之AsyncTask使用总结

Android的AsyncTask轻量级简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI 的更新只能在主线程中完成,因此异步处...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年11月09日 13:13
  • 1084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异步任务AsyncTask
举报原因:
原因补充:

(最多只允许输入30个字)