异步任务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

  • 2016-09-13 00:45
  • 1.96MB
  • 下载

安卓 异步任务 ----AsyncTask

一 为什么异步任务   1.android 的单线程模型   2.耗时操作放在非主线程中操作 二  AsyncTask  为何而生   1.在子现成中更新UI 2.封装 简化异步操作 三  构造A...
  • LTG01
  • LTG01
  • 2015-10-11 09:59
  • 530

Android 异步任务 AsyncTask

android异步任务详解 AsynTask android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。 其实...

AsyncTask异步任务三.rar

  • 2015-01-11 09:35
  • 1.38MB
  • 下载

Android深入浅出系列课程---Lesson16-AFF110606_AsyncTask异步任务

大家好,上一讲我们介绍了Handler-不可缺少的异步,这一讲我们将进入AFF110606_AsyncTask异步任务. 更多Android深入浅出课程列表:http://www.eoeandroi...

AsyncTask异步任务

  • 2017-06-06 23:31
  • 91KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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