本发明涉及通信技术领域,尤其涉及一种基于Android的异步多任务顺序加载方法。
背景技术:
在Android中实现异步任务机制有两种方式:Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制,AsyncTask类使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务,在2.3之后的版本可以支持并行和串行。AsyncTask的缺点是它创建的实例只能被执行一次,否则多次调用时将会出现异常。在实际开发中经常会用到异步多任务的情况,例如加载含有图片的数据列表,由于图片的加载比较耗时,为了提升用户的体验,一般都会采用异步加载。以上2种方式在单任务情况下的问题并不突出,但在多任务中其弊端就会凸显出来,难以达到按照列表先后顺序执行的目的。
技术实现要素:
鉴以此,本发明的目的在于提供一种基于Android的异步多任务顺序加载方法,以至少解决以上问题。
一种基于Android的异步多任务顺序加载方法,包括:
创建若干个AsyncTask异步任务类,为每个AsyncTask异步任务类内置的doInBackgroud方法设置具体的异步任务内容;
在UI主线程中创建循环体方法,所述循环体方法用于逐次执行AsyncTask异步任务,直至所有异步任务执行完毕。
进一步的,所述循环体方法在逐次执行AsyncTask异步任务时,通过监听AsyncTask异步任务类内置的方法返回值判断AsyncTask异步任务是否执行完成。
进一步的,逐次执行AsyncTask异步任务时,有返回值的AsyncTask异步任务调用其onPostExecute方法,在UI主线程中完成资源的加载。
进一步,在创建AsyncTask异步任务类并为每个AsyncTask异步任务类设置具体的异步任务内容后,
将执行异步任务所需的全部数据逐个添加到一个数组中;
所述循环体方法每次执行循环体时,从所述数组中按顺序取出一个异步任务;
数据取出成功时,执行该异步任务;否则代表异步任务顺序队列执行完毕,终止循环。
进一步的,使用SparseIntArray稀疏数组存放执行异步任务所需的全部数据。
进一步的,数据取出成功时,执行该异步任务,包括:
调用AsyncTask异步任务类的doInBackgroud方法在后台创建新线程执行异步任务;
异步任务执行完成后调用AsyncTask异步任务类的onPostExecute方法在UI主线程完成资源的加载。
进一步的,创建QueueAsyncTask类,所述SparseIntArray稀疏数组作为所述QueueAsyncTask类的变量用于存放异步任务顺序队列,同时QueueAsyncTask类分别声明doInBackgroud接口以及onPostExecute接口,doInBackgroud接口用于实现对AsyncTask异步任务类的doInBackgroud方法的调用;onPostExecute接口用于实现对AsyncTask异步任务类的doInBackgroud方法的调用。
与现有技术相比,本发明的有益效果是:
本发明提供的一种基于Android的异步多任务顺序加载方法,通过在UI主线程中设计循环体,实现异步多任务按照开发人员所希望的顺序执行的效果,解决了开发中需要异步加载大量数据的问题,相较于现有技术结构更为简洁,高效且易于维护,能避免程序出现不必要的错误。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的优选实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的系统整体结构示意图。
图2是本发明实施例的异步任务类创建并完成设置后的流程示意图。
具体实施方式
在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
以下结合附图对本发明的原理和特征进行描述,所列举实施例只用于解释本发明,并非用于限定本发明的范围。这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本发明的示例性实施例的目的。但是本发明可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。
参照图1,本发明提供一种基于Android的异步多任务顺序加载方法,所述方法包括:
步骤S1,创建若干个AsyncTask异步任务类,为每个AsyncTask异步任务类内置的doInBackgroud方法设置具体的异步任务内容。
当应用程序启动,Android会创建一个主线程,主线程负责向UI组件分发事件、绘制事件,在主线程中,应用程序与Android系统的UI组件进行交互,所以主线程也被称为UI主线程。由于只有UI主线程才能对UI进行更新操作,其他线程无法直接操作UI,这样的好处是保证了UI的稳定性和准确性,避免多个线程同时操作UI造成混乱,但不能将所有任务都放到UI主线程中实现,比如网络操作、大容量文件读取等耗时操作,否则很可能会造成后续任务的阻塞,当阻塞时间过长,Android系统会抛出ANR错误,对于要求稳定性的应用程序应该尽力避免这种情况的发生,因此需要将耗时任务放到非主线程中去执行。AsyncTask异步任务类,是一个专门用于处理异步任务的类。通过此类,可以实现UI主线程和后台线程的通讯,后台线程执行开发者设定的异步任务,并把结果返回给UI主线程,避免了Android应用的单线程模型以及抛出ANR的情况。
步骤S2,在UI主线程中创建循环体方法,所述循环体方法用于逐次执行AsyncTask异步任务,直至所有异步任务执行完毕。
步骤S2中,所述循环体方法在逐次执行AsyncTask异步任务时,通过监听AsyncTask异步任务类内置的方法返回值判断AsyncTask异步任务是否执行完成。AsyncTask异步任务类主要内置了四个方法:onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute(),其中,异步任务所需要完成的耗时操作被写在doInBackground()的方法体中,系统会在后台的线程池中开启一个work thread来执行这个方法。当一个异步任务执行完毕时,系统会自动调用onPostExecute()方法,并将doInBackground()方法返回的值传入该方法中,以对UI进行相应的更新,通过监听该方法的返回值,判断异步任务是否执行完成,当当前所监听的异步任务完成,执行下一个异步任务,直到异步任务全部执行完毕。
在上述实施例的基础上,为了能够让多个异步任务按照开发者的设想顺序执行,从而简洁代码的结构,提高代码的可阅读性,同时对UI更新时给用户以良好的感官体验,需要对异步任务的执行顺序采取方法进行限制。参照图2,步骤S1中,在创建AsyncTask异步任务类并为每个AsyncTask异步任务类设置具体的异步任务内容后,还包括:
步骤S11,将执行异步任务所需的全部数据逐个添加到一个数组中。
步骤S11中,执行异步任务所需的全部数据被逐个存放到SparseIntArray稀疏数组中。当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用,因此造成内存空间的浪费,甚至会造成内存溢出,因此为了达到节省内存空间的效果,同时不影响数组中所存储的异步任务数据,采用SparseIntArray稀疏数组作为存储异步任务数据的集合,SparseIntArray稀疏数组分为两部分,一部分用于记录原数组的列数、行数以及元素使用的个数,第二部分记录原数组中元素的位置和内容,其核心是折半查找函数,用数组数据结构来保存映射,然后通过折半查找来找到所需数据对象,不依赖外部对象映射,可以有效提高内存效率。
步骤S12,所述循环体方法每次执行循环体时,从所述数组中按顺序取出一个异步任务。
步骤S12中,由于每个异步任务均存储于数组中,通过唯一的数组下标对异步任务所存放位置进行标志,在将异步任务数据存储到数组中时,可以按照开发者所需加载顺序逐个对异步任务进行存储,在取出时按数组下标顺序取出以执行,从而实现异步任务按顺序加载。同时也可以按照开发需求,通过设计循环体循环条件以实现非连续的数组数据读取,此时异步任务数据在数组中可以不用按照加载顺序进行存储。
步骤S13,数据取出成功时,执行该异步任务;否则代表异步任务顺序队列执行完毕,终止循环。
在步骤S13中,数据取出成功后,执行该异步任务,包括:
调用AsyncTask异步任务类的doInBackgroud()方法在后台创建新线程执行异步任务。
异步任务执行完成后调用AsyncTask异步任务类的onPostExecute()方法在UI主线程完成资源的加载。
在本发明的一个可选实施例中,为了保证任务队列被按照定制的顺序串行执行,同时降低应用程序各个模块间的耦合度,从而提高应用程序的可扩展性,同时避免程序在运行过程中出现不必要的错误,保证其平稳运行,创建QueueAsyncTask类,在所述QueueAsyncTask类中声明SparseIntArray稀疏数组以用于存放异步任务顺序队列,同时在所述QueueAsyncTask类中分别声明doInBackgroud()接口以及onPostExecute()接口,doInBackgroud()接口用于实现对AsyncTask异步任务类的doInBackgroud()方法的调用;onPostExecute()接口用于实现对AsyncTask异步任务类的doInBackgroud()方法的调用,在异步串行多任务的执行过程中,所述QueueAsyncTask类仅向外部暴露了所必须的doInBackgroud()接口以及onPostExecute()接口,使得代码耦合度降低,易于维护;QueueAsyncTask类中也可以根据开发需求声明其他接口以调用AsyncTask异步任务类中的相关方法,可扩展性强。
需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。