android的异步任务解析

来源:互联网 发布:淘宝背后的老板是谁 编辑:程序博客网 时间:2024/05/17 23:04

异步操作一般解决线程被阻塞的问题,一般比较耗时的操作不放在主线程里,而是另外开启一个新的线程来操作。
android提供了一个异步任务类:AsyncTask,该类的用法是一般由程序员自己声明一个AsyncTask子类,该子类要覆写其doInBackground()方法,该方法里实现较耗时的操作。然后在主线程里声明该子类的对象,然后调用其execute()方法(而不是doInBackground()方法)。

AsyncTask的执行过程
这里写图片描述

当调用execute()方法时,会首先调用其onPreExecute()方法,其实onPreExecute()还有onPostExecute()方法都是在主线程里执行,可以在这两个方法里对UI控件进行控制与更新操作,只有doInBackground()方法是在新的线程里进行的。当然,异步线程有可能会是新开的,也有可能是线程池里已有的,但重点是它与主线程是两个不同的线程,因为其doInBackground()方法里的操作不会对UI线程(主线程)造成阻塞。

由上可知,如果在主线程(UI线程)里有一个进度条,需要根据耗时操作的执行情况实时更新进度条,这样就需要在onPreExecute()或者onPostExecute()方法里更新进度条。但是到底在哪一个方法里进行呢?

要解决上面的问题,我们先来看看AsyncTask类的三个类型参数,第一个参数一般是定义doInBackground()函数接收的参数。第二个参数定义的是onProgressUpdate()函数所接收的参数类型。第三个参数定义的是doInBackground()函数的返回类型,还有onPostExecute()方法的接收参数类型。

这里,当执行execute()方法后,将首先调用onPreExecute()方法,onPreExecute()在UI线程当中运行。其次是执行doInBackground()方法 (该方法不运行在UI线程中,所以在该方法中不能对UI 线程中的控件进行设置与修改),在执行doInBackground()方法的过程中,可以调用publishProgress()方法,用来发布一个更新。每次调用这个方法(publishProgress()方法),都会触发onProgressUpdate()方法的执行(onProgressUpdate()方法是在UI线程中执行的)。

onPostExecute()方法实在doInBackground()方法执行完后执行,并且运行在UI线程当中。改方法的接收参数就是doInBackground()方法的返回值!!!

以上就是AsyncTask的执行流程!!!

综上,当我们要执行一个网络任务或者耗时操作时,可以在onPreExecute()方法里通过更新具体的UI控件告知用户接下来的时间将是一个等待的时间,即主要用于异步任务之前的UI准备工作。
然后在doInBackground()方法里踏踏实实的干事情,进行异步操作,在干事情的过程中我们可以通过publishProgress(int i)触发onProgressUpdate(int i)方法的执行,以更新进度条之类的形式来告诉不耐心的用户这项任务已经进行到什么程度了。最后在doInBackground()方法执行完毕后,将其返回值传递给onPostExecute()方法,让onPostExecute()方法来告知用户想要的答案,展示异步任务操作结束后的结果!

具体的Demo代码会在接下来的项目源码中给出。

0 0
原创粉丝点击