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

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













SoundPool播放音效

上次有提到用MediaPlayer来播放音频,但是要播放密集的,短促的音效还是用SoundPool好。主要是MediaPlayer资源占用率较高,延时时间较长,不支持多个音频同时出现。 SoundPo...

异步任务AsyncTask

  • 2016年09月13日 00:45
  • 1.96MB
  • 下载

[Android]异步任务AsyncTask使用解析

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。 AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型...

Android异步任务AsyncTask实例源码

  • 2016年12月27日 10:53
  • 26.27MB
  • 下载

一个AsyncTask异步任务的操作实例

  • 2015年08月20日 00:06
  • 10.43MB
  • 下载

Android Studio利用异步任务AsyncTask发送post请求获取json数据

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI...

AsyncTask异步任务三.rar

  • 2015年01月11日 09:35
  • 1.38MB
  • 下载

Android异步任务AsyncTask的简单DEMO

  • 2015年09月22日 11:14
  • 629KB
  • 下载

AsyncTask异步任务类的使用

异步任务类的使用是为了,能够通过子线程加载数据,而在Ui线程刷新界面 下面通过一个例子具体讲解异步任务类的使用 1定义异步任务类,异步任务类必须继承AsyncTask //三个参数的意义:第一个是启动...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异步任务AsyncTask
举报原因:
原因补充:

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