发明内容
基于上述问题,本申请提供了一种基于kotlin的数据离线上传方法及装置,以解决离线上传过程中,开发量大、成本高、通用性差的问题。
本申请公开了一种基于kotlin的数据离线上传方法,所述方法包括:
当数据上传失败时,通过kotlin获取所述数据的数据类型集;所述数据类型集包括上传函数的函数名、上传函数的参数列表、回调函数的函数名和回调函数的参数列表;
将所述数据和所述数据类型集作为一个数据对象,存入位于本地的离线数据文件夹中;
以预设频率判断上传是否可行,直至上传可行;
获取所述离线数据文件夹中的数据对象;
通过kotlin将所述数据对象中的数据上传。
可选的,所述判断上传是否可行,包括:
判断网络是否可用,并检查所述离线数据文件夹是否为空;
如果网络可用且所述离线数据文件夹不为空,则判断所述离线数据文件夹中的数据对象所占空间大小是否超过预设大小;
如果是,则提醒用户检查并开启网络;
如果否,则判断上传可行。
可选的,所述获取所述离线数据文件夹中的数据对象,包括:
创建协程管道,并设置所述协程管道的预设任务量;
遍历所述离线数据文件夹中的数据对象,并将每一个数据对象作为一个上传任务,添加到所述协程管道中。
可选的,在通过kotlin将所述数据对象上传前,所述方法还包括:
判断所述协程管道中的上传任务是否超过所述预设任务量;
若是,则暂停上传任务的添加,直至所述协程管道中的上传任务小于所述预设任务量;
若否,则添加上传任务。
可选的,在获取所述离线数据文件夹中的数据对象后,所述方法还包括:删除所述离线数据文件夹中的所述数据对象。
可选的,所述通过kotlin将所述数据对象上传,包括:
通过kotlin反射的方式调用所述数据对象中的上传函数,以上传所述数据对象;
当所述数据对象上传成功时,通过kotlin反射的方式调用所述数据对象中的回调函数。
基于上述一种基于kotlin的数据离线上传方法,本申请还公开了一种基于kotlin的数据离线上传装置,包括:类型集获取单元、数据对象存储单元、可行性判断单元、数据对象获取单元和上传单元;
所述类型集获取单元,用于当数据上传失败时,通过kotlin获取所述数据的数据类型集;所述数据类型集包括上传函数的函数名、上传函数的参数列表、回调函数的函数名和回调函数的参数列表;
所述数据对象存储单元,用于将所述数据和所述数据类型集作为一个数据对象,存入位于本地的离线数据文件夹中;
所述可行性判断单元,用于以预设频率判断上传是否可行,直至上传可行;
所述数据对象获取单元,用于获取所述离线数据文件夹中的数据对象;
所述上传单元,用于通过kotlin将所述数据对象中的数据上传。
可选的,所述可行性判断单元,包括:
网络与文件夹判断子单元,用于判断网络是否可用,并检查所述离线数据文件夹是否为空;
空间判断子单元,用于判断所述离线数据文件夹中的数据对象所占空间大小是否超过预设大小;
网络提醒子单元,用于提醒用户检查并开启网络;
确认子单元,用于判断上传可行。
可选的,所述数据对象获取单元,包括:
管道创建子单元,用于创建协程管道,并设置所述协程管道的预设任务量;
任务添加子单元,用于遍历所述离线数据文件夹中的数据对象,并将每一个数据对象作为一个上传任务,添加到所述协程管道中。
可选的,所述装置还包括:
任务量判断单元,用于判断所述协程管道中的上传任务是否超过所述预设任务量;
添加暂停单元,用于暂停上传任务的添加,直至所述协程管道中的上传任务小于所述预设任务量;
若否,则添加上传任务。
可选的,所述上传单元包括:
上传函数调用子单元,用于通过kotlin反射的方式调用所述数据对象中的上传函数,以上传所述数据对象;
回调函数调用子单元,用于通过kotlin反射的方式调用所述数据对象中的回调函数。
可选的,所述装置还包括:
数据对象删除单元,用于删除所述离线数据文件夹中的所述数据对象。
本申请公开了一种基于kotlin的数据离线上传方法及装置。当数据上传失败时,通过kotlin获取数据的数据类型集,并与数据一起作为一个数据对象,存入位于本地的离线数据文件夹。之后以预设频率判断上传是否可行,如果是,则获取离线数据文件夹中的数据对象,通过kotlin将数据对象中的数据上传。其中数据类型集包括上传函数和回调函数的函数名、参数,用以通过kotlin上传数据,如此能够使上传数据的流程成为一个通用的处理流程,当新增上传数据种类时,无需针对不同种类数据去做不同处理,解决了随数据种类增多导致的开发量大、维护困难的问题。此外,kotlin获取函数名及参数时,还能避免硬编码的弊端。
具体实施方式
在描述本实施例所述的方法前,为了使本申请文件更加易懂,下面将对于本申请文件中的一些专业术语、Kotlin的实现环境和特性做解释。
本申请基于编程语言Kotlin,应用于android应用开发。反射是一种存在于Kotlin中的可以动态执行程序函数的方式。反射调用函数需要用到函数名、参数名、参数值(因为函数可能有多个参数,需要根据参数名去一一对应传入参数的值),例如id是参数名,id的实际值就是参数值。硬编码指,代码在某一处被直接嵌入,在编译器中无法被链接到,硬编码问题不利于代码的维护,而kotlin的语言特性可以获取到函数名及参数,能够有效避免硬编码的问题。动态执行指程序执行到某一处时,根据传入的函数名、参数、参数值去决定执行某一个函数。相对地,静态执行是指代码编译好后已经确定执行的部分。协程是kotlin提供的一种可以并行执行任务的技术,类似于线程,启动多个协程可以同时执行多个任务。协程管道是协程之间通信的桥梁,一个协程可以向管道中不断添加消息,另一个协程可以从管道中取出消息。此外,回调函数是一个负责上传成功后的处理的函数。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
实施例一:本申请公开了一种基于kotlin的数据离线上传方法。
具体的,请参阅图1,本实施例公开的一种基于kotlin的数据离线上传方法包括以下步骤:
步骤101:当数据上传失败时,通过kotlin获取所述数据的数据类型集。
在本实施例所述的方法中,所述数据类型集包括上传函数的函数名、上传函数的参数列表、回调函数的函数名和回调函数的参数列表。
在本实施例所述的方法中,作为一种可选的方法,当由于网络不通等因素上传数据失败时,可以利用kotlin的函数引用来获取数据类型集。以便后续数据上传步骤中,利用kotlin反射调用函数进行上传和回调。
步骤102:将所述数据和所述数据类型集作为一个数据对象,存入位于本地的离线数据文件夹中。
在本实施例所述的方法中,可以将一个数据对象视为一次离线上传操作,当上传失败时,就把这个离线数据对象存储在离线数据文件夹中。其中,作为一种可选的方法,可以使用对象序列化的方式进行数据的存储,通俗地说,序列化就是把这个数据对象转化为数据流的形式保存起来。常用的数据类型,例如字符串、数字等都可以被序列化。
在本实施例所述的方法中,区别于使用Sqlite数据库等本地存储技术,本实施例所述方法中的序列化的存储方式简单易用,避免了复杂的数据处理过程。其中,所述序列化的方式有多种,包括json字符串、Serilizable、Parcelable等,在此不对本实施例中序列化的方式做具体限定,能够实现数据对象的序列化即可。
步骤103:以预设频率判断上传是否可行,直至上传可行。则进入步骤104。
在本实施例所述的方法中,作为一种可选的方法,先以预设频率判断网络是否可用,并检查离线数据文件夹是否为空。若网络不可用或离线数据文件夹为空,说明网络状态依旧无法上传数据,或没有需要上传的数据,因此就不用执行后续的数据上传步骤了。
其中,所述预设频率可以根据用户的需求进行设置,例如每一分钟一次。在此不对预设频率的数值做具体限定,不影响本实施例所述方法中的后续步骤即可。
其中,判断网络可用和离线数据文件夹是否为空的顺序可以为一先一后,也可以为同时进行,在此不对二者的操作顺序做具体限定,能够对二者都进行判断即可。
在本实施例所述的方法中,当网络可用且所述离线数据文件夹不为空时,判断离线数据文件夹中的数据对象所占空间大小是否超过预设大小。如果是,则提醒用户检查并开启网络,如果否,则判断上传可行。因为网络长期处于不可以状态时,离线数据文件夹中的数据将持续增多,为防止过多的数据导致本地存储空间不足,当离线数据达到一定量时,须对用户进行提醒。作为一种可选的方法,所述预设大小可以根据移动设备自身的存储空间大小进行设置。
步骤104:获取所述离线数据文件夹中的数据对象。
在本实施例所述的方法中,作为一种可选的方法,先创建协程管道,并设置协程管道的预设任务量,遍历离线数据文件夹中的数据对象,并将每一个数据对象作为一个上传任务,添加到协程管道中。其中,作为一种可选的方法,与序列化相反,可以使用数据反序列化的方式进行数据对象的获取(读取),通俗地说,反序列化就是把数据流转化为数据对象的形式加以读取。
在本实施例所述的方法中,可以在上传任务的添加过程中,判断协程管道中的上传任务是否超过预设任务量。若是,则暂停上传任务的添加,直至协程管道中的上传任务小于预设任务量。其中,所述预设任务量为协程管道中允许存在的任务量限制,当协程管道中的任务量超过这个限制时,便不能再向协程管道中添加上传任务。否则,就不断地向协程管道中添加上传任务。预设任务量用于控制同时进行上传任务的数量,防止同时进行的上传任务过多而影响移动设备的性能。
作为一种可选的方法,所述预设任务量可以根据用户需求进行设置,在此不对预设任务量的数值做具体限定,能够在不影响移动设备性能的同时,完成后续的数据上传步骤即可。
在本实施例所述的方法中,作为一种可选的方法,在上述步骤操作完成时,从离线数据文件夹里删除掉刚刚添加到协程管道中的数据对象,待上传失败后再重新添加。因为在本实施例所述的方法中,需要以预设频率执行步骤103从而进行后续步骤,若在数据上传成功后再删除本地的数据对象,可能导致该数据在上传过程中,由于没有删除而被重复上传。
步骤105:通过kotlin将所述数据对象中的数据上传。
在本实施例所述的方法中,作为一种可选的方法,可以通过kotlin反射的方式调用所述数据对象中的上传函数,以上传所述数据对象。当所述数据对象上传成功时,通过kotlin反射的方式调用所述数据对象中的回调函数。
相比于直接存储http请求的请求报文以进行离线上传和使用java反射,本实施例所述的方法存储的内容较少、能解决上传成功后的回调问题且能够避免java反射带来的硬编码问题。
本实施例所述方法利用kotlin引用函数来获取函数名及参数,避免了硬编码的弊端,有利于代码的维护。通过kotlin反射调用上传函数和回调函数的方式,使数据上传流程具有通用性,能够不用在新增上传数据种类时,针对不同种类数据做不同处理,从而解决了随数据种类增多导致的开发量大、维护困难的问题。
实施例二:本申请公开了另一种基于kotlin的数据离线上传方法,请参阅图2,本实施例所述方法针对数据上传的整体过程做介绍。
步骤201:以预设频率判断网络是否可用。若是,则进入步骤202,若否,则进入步骤201。
步骤202:检查离线数据文件夹是否为空。若是,则进入步骤203,若否,则进入步骤201。
步骤203:判断离线数据文件夹中的数据对象所占空间大小是否超过预设大小。若是,则进入步骤204,若否,则进入步骤205。
步骤204:提醒用户检查并开启网络。
步骤205:遍历离线数据文件夹中的数据对象,并将每一个数据对象作为一个上传任务,添加到协程管道中。
步骤206:判断协程管道中的上传任务是否超过预设任务量。若是,则进入步骤207,若否,则进入步骤208。
步骤207:暂停上传任务的添加,直至协程管道中的上传任务小于预设任务量。
步骤208:从离线数据文件夹里删除掉上述步骤中添加到协程管道中的数据对象。
步骤209:通过kotlin将所述数据对象中的数据上传。
本实施例所述方法针对数据上传的整体过程做介绍。本实施例所述的步骤为通过kotlin实现的数据上传流程,其具有通用性,能够不用在新增上传数据种类时,针对不同种类数据做不同处理,从而解决了随数据种类增多导致的开发量大、维护困难的问题。
基于上述实施例公开的一种基于kotlin的数据离线上传方法,本实施例对应公开了一种基于kotlin的数据离线上传装置。请参阅图3,所述一种基于kotlin的数据离线上传装置包括:类型集获取单元301、数据对象存储单元302、可行性判断单元303、数据对象获取单元304和上传单元305;
所述类型集获取单元301,用于当数据上传失败时,通过kotlin获取所述数据的数据类型集;所述数据类型集包括上传函数的函数名、上传函数的参数列表、回调函数的函数名和回调函数的参数列表;
所述数据对象存储单元302,用于将所述数据和所述数据类型集作为一个数据对象,存入位于本地的离线数据文件夹中;
所述可行性判断单元303,用于以预设频率判断上传是否可行,直至上传可行;
所述数据对象获取单元304,用于获取所述离线数据文件夹中的数据对象;
所述上传单元305,用于通过kotlin将所述数据对象中的数据上传。
可选的,所述可行性判断单元303,包括:
网络与文件夹判断子单元,用于判断网络是否可用,并检查所述离线数据文件夹是否为空;
空间判断子单元,用于判断所述离线数据文件夹中的数据对象所占空间大小是否超过预设大小;
网络提醒子单元,用于提醒用户检查并开启网络;
确认子单元,用于判断上传可行。
可选的,所述数据对象获取单元304,包括:
管道创建子单元,用于创建协程管道,并设置所述协程管道的预设任务量;
任务添加子单元,用于遍历所述离线数据文件夹中的数据对象,并将每一个数据对象作为一个上传任务,添加到所述协程管道中。
可选的,所述装置还包括:
任务量判断单元,用于判断所述协程管道中的上传任务是否超过所述预设任务量;
添加暂停单元,用于暂停上传任务的添加,直至所述协程管道中的上传任务小于所述预设任务量;
若否,则添加上传任务。
可选的,所述上传单元305包括:
上传函数调用子单元,用于通过kotlin反射的方式调用所述数据对象中的上传函数,以上传所述数据对象;
回调函数调用子单元,用于通过kotlin反射的方式调用所述数据对象中的回调函数。
可选的,所述装置还包括:
数据对象删除单元,用于删除所述离线数据文件夹中的所述数据对象。
本说明书中实施例采用递进的方式描述。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
本说明书中实施例中记载的特征可以相互替换或者组合,使本领域专业技术人员能够实现或使用本申请。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。