异步任务AsyncTask

来源:互联网 发布:java http文件服务器 编辑:程序博客网 时间:2024/04/29 05:35

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

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
原创粉丝点击