用于界面显示的数据查询方法、装置、计算机设备及存储介质与流程

文档序号:11251020
用于界面显示的数据查询方法、装置、计算机设备及存储介质与流程

本发明涉及信息处理技术领域,特别是涉及一种用于列表类界面显示的数据查询方法、一种用于列表类界面显示的数据查询装置、一种计算机设备以及一种计算机存储介质。



背景技术:

在目前的终端应用中,会涉及到众多的列表类界面的显示,用以进行列表类界面显示的数据,通常是通过数据库查询的方式获得以用于列表类界面的显示。以Android系统为例,Android系统使用数据库查询用于列表类界面的显示的数据,一般做法是使用系统提供的数据库接口执行一个数据库查询,系统接口将查询结果填充到数据缓冲区并返回一个数据库读取抽象接口对象,然后Android系统的应用程序将数据库读取抽象接口对象设置到组件,完成数据到界面的绑定,界面通过界面→组件→数据库读取抽象接口对象→数据缓冲区的路径获取到查询好的数据。该方法虽然方便使用,但却有诸多缺点,典型的缺陷是需要等待查询全部完成、查询结果全部填充到数据缓冲区后,界面才能显示,而在此之前只能等待。数据缓冲区长度固定,若结果集非常大,则只能缓存前面一部分。当界面滑动到缓存部分以外,数据缓冲区需要在主线程重新查询和填充,造成界面卡顿。



技术实现要素:

基于此,有必要针对列表类界面显示时容易造成界面卡顿的问题,提供一种用于列表类界面显示的数据查询方法、一种用于列表类界面显示的数据查询装置、一种计算机设备以及一种计算机存储介质。

为达到上述目的,一个实施例中采用以下技术方案:

一种用于列表类界面显示的数据查询方法,包括步骤:

主线程在进入列表类显示界面时,向工作线程发送查询请求;

工作线程根据所述查询请求进行查询,获取缓冲区以及初始长度数据,将获取的初始长度数据填入所述缓冲区后,向主线程返回数据库读取抽象接口,并查询所述初始长度数据之后的第一长度数据,将查询获得的第一长度数据填入所述缓冲区;

主线程根据数据库读取抽象接口从所述缓冲区读取初始长度数据,并根据读取的初始长度数据渲染列表;

主线程向工作线程发送数据请求,数据请求携带数据位置信息;工作线程接收所述数据请求,在缓冲区没有所述数据位置信息对应的数据时,记录所述数据位置信息,并在填入缓冲区的数据覆盖所述数据位置信息时,向主线程发送通知消息。

一种用于列表类界面显示的数据查询装置,包括:

主线程模块,在进入列表类显示界面时,向工作线程模块发送查询请求,并根据工作线程模块返回的数据库读取抽象接口从缓冲区读取初始长度数据,并根据读取的初始长度数据渲染列表,并向工作线程模块发送数据请求,数据请求携带数据位置信息;

工作线程模块,根据所述查询请求进行查询,获取缓冲区以及初始长度数据,将获取的初始长度数据填入所述缓冲区后,向主线程模块返回数据库读取抽象接口,并查询所述初始长度数据之后的第一长度数据,将查询获得的第一长度数据填入所述缓冲区;并接收所述数据请求,在缓冲区没有所述数据位置信息对应的数据时,记录所述数据位置信息,并在填入缓冲区的数据覆盖所述数据位置信息时,向主线程模块发送通知消息。

一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的用于列表类界面显示的数据查询方法。

一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述的用于列表类界面显示的数据查询方法。

基于如上所述的本发明实施例的方案,结合主线程和工作线程两个线程完成用于列表类界面显示的数据查询过程,查询过程始终在工作线程进行,不占用主线程,主线程在进入列表类显示界面时,向工作线程发送查询请求,工作线程接收到该查询请求后,无需等待缓冲区填满,获得缓冲区和较小的初始长度数据之后,先将缓冲区和较小的初始长度数据返回给主线程进行显示,且工作线程向主线程返回初始长度数据之后,会继续查询初始长度数据之后的第一长度数据,从而使得主线程可以用初始长度数据进行初始界面显示,且可以尽快从工作线程获得新的查询数据用以界面显示,提高了列表类界面的显示的响应速度和界面流畅性。

附图说明

图1是一个实施例的终端的组成结构的示意图;

图2是一个实施例的用于列表类界面显示的数据查询方法的流程示意图;

图3是一个具体示例中的主线程和工作线程之间的交互关系的示意图;

图4是一个具体示例中的分块缓冲区的示意图;

图5是一个实施例的用于列表类界面显示的数据查询方法的结构示意图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。

除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“或/及”包括一个或多个相关的所列项目的任意的和所有的组合。

本实施例涉及的是终端对列表类界面的显示方案,终端在一个实施例中的结构示意图如图1所示,该终端包括通过系统总线连接的处理器、非易失性存储介质、通信接口、电源接口和内存。其中,终端的非易失性存储介质存储有操作系统和用于列表类界面显示的数据查询的方法对应的计算机应用程序(图示中记为用于列表类界面显示的数据查询装置),该方法对应的计算机应用程序被处理器执行时,实现一种用于列表类界面显示的数据查询的方法。终端的处理器用于提供计算和控制能力,支撑整个终端的运行。终端的存储器为非易失性存储介质中的程序的运行提供环境,该存储器中可储存有计算机可读指令,该计算机可读指令被处理器执行时,可使得处理器执行一种用于列表类界面显示的数据查询的方法。终端的网络接口用于与外部设备网络连接和通信,终端的电源接口用于与外部电源连接,外部电源通过该电源接口向终端供电。终端可以是任何一种能够实现智能输入输出的设备,例如移动终端,比如手机、平板电脑等;也可以是其它具有上述结构的设备。

图2是一个实施例中的用于列表类界面显示的数据查询方法的流程示意图。如图2所示,该实施例的方法包括:

步骤S201:主线程在进入列表类显示界面时,向工作线程发送查询请求;

步骤S202:工作线程根据所述查询请求进行查询,获取缓冲区以及初始长度数据,将获取的初始长度数据填入所述缓冲区后,向主线程返回数据库读取抽象接口,并查询所述初始长度数据之后的第一长度数据,将查询获得的第一长度数据填入所述缓冲区;

步骤S203:主线程根据数据库读取抽象接口从所述缓冲区读取初始长度数据,并根据读取的初始长度数据渲染列表;

步骤S204:主线程向工作线程发送数据请求,数据请求携带数据位置信息;工作线程接收所述数据请求,在缓冲区没有所述数据位置信息对应的数据时,记录所述数据位置信息,并在填入缓冲区的数据覆盖所述数据位置信息时,向主线程发送通知消息。

基于如上所述的本发明实施例的方案,结合主线程和工作线程两个线程完成用于列表类界面显示的数据查询过程,查询过程始终在工作线程进行,不占用主线程,主线程在进入列表类显示界面时,向工作线程发送查询请求,工作线程接收到该查询请求后,无需等待缓冲区填满,获得缓冲区和较小的初始长度数据之后,先将缓冲区和较小的初始长度数据返回给主线程进行显示,且工作线程向主线程返回初始长度数据之后,会继续查询初始长度数据之后的第一长度数据,从而使得主线程可以用初始长度数据进行初始界面显示,且可以尽快从工作线程获得新的查询数据用以界面显示,使得列表类界面的显示不再卡顿。

在一个示例中,工作线程在将查询获得的第一长度数据填入所述缓冲区之后,可以进入睡眠状态,直至接收到主线程发送的所述数据请求。

上述主线程向工作线程发送的数据请求,可以是在任何需要进一步请求数据时进行发送。

在一个示例中,主线程可以在进入的列表类显示界面的列表可见部分的所述数据位置信息大于所述初始长度数据的位置信息时,向工作线程发送所述数据请求。从而,主线程在获得初始长度数据进行渲染显示之后,如果初始长度数据无法渲染全部的初始显示界面,即可见部分的位置信息大于初始长度数据的位置信息,则向工作线程发送数据请求,以获得更多的数据进行当前显示界面的显示。

另一方面,主线程也可以在滚动的过程中向工作线程发送上述数据请求,以请求新的数据进行渲染显示。主线程可以在接收到界面滚动指令时,滚动并绘制滚动后列表界面,将滚动后列表界面的当前可见部分的最大位置信息作为所述数据位置信息,向工作线程发送所述数据请求。

其中,主线程在向工作线程发送所述数据请求后,可以在满足调度优先级调整条件时,提高所述工作线程的调度优先级。从而,在主线程向工作线程发送数据请求后,如果工作线程已经将工作将上述数据位置信息对应的数据填充到缓冲区,则主线程可以直接从缓冲区拿到数据进行渲染。如果工作线程尚未将数据位置信息对应的数据填充到缓冲区,则主线程需要等待。此时,主线程通过提高工作线程的调度优先级,可以使得工作线程可以尽快将需要的数据填充到缓冲区,进一步减少卡顿现象。

其中,这里的调度优先级调整条件,可以结合实际需要进行设置。一个示例中,主线程可以是在向工作线程发送数据请求之后,在预定时间段内未接收到工作线程返回的通知消息时,判定满足调度优先级调整条件。在另一个示例中,由于上述工作线程已经向主线程返回了缓冲区索引标识,因此,主线程在向工作线程发送数据请求之后,可以先尝试从缓冲区索引标识对应的缓冲区读取对应的数据,若未读取到对应的数据,则判定满足调度优先级调整条件。在其他示例中,对调度优先级调整条件,也可以做其他不同的设定。

在上述提高了工作线程的调度优先级之后,主线程还可以在接收到工作线程返回的上述通知消息时,将工作线程的调度优先级设置为默认优先级,即将工作线程的调度优先级调整回原来的调度优先级。

由于在列表类界面显示的过程中,由于主线程可能会基于不断的滚动过程,不断地查询新的数据进行显示,而缓冲区的容量本身是有限的。因此,在一个示例中,工作线程在所述数据位置信息对应的数据量超过缓冲区容量时,可以丢弃缓冲区的前第二长度数据后,再将查询获得的数据填充所述缓冲区,以确保缓冲区中缓存的是最新请求的数据。

由于工作线程会将更早的数据从缓冲区清除,而在列表类界面的显示过程中,用户可能会向上滚动,即可能会需要重新将之前已经显示过的数据重新渲染显示。因此,在一个示例中,工作线程还可以在所述数据位置信息小于上一次的数据请求中的位置信息、且所述数据位置信息对应的数据不在所述缓冲区时,从初始位置遍历数据,并在遍历到所述数据位置信息对应的数据或者所述数据位置信息的前第三长度数据时,开始将遍历到的数据填充到缓冲区。

主线程在离开列表界面时,向工作线程发送退出请求通知,工作线程接收退出请求通知之后关闭查询并释放缓冲区,从而完成列表类界面显示的退出过程的处理。

在本示例的方案中,缓冲区可以由分块缓冲区来实现,其中,各分块缓冲区的大小可以相同,也可以不相同。每个分块缓冲区均可以有起始位置和结束位置,在需要填充新的数据、增长缓冲区时,分配一个新的分块缓冲区并将该分块缓冲区的标识添加到上述缓冲区索引标识即可。在此情况下,在需要删除缓冲区的数据时,可以直接删除对应位置的分块缓冲区即可。

以下结合其中一个具体示例进行详细举例说明。本实施例的方案,可以用于所有使用数据库查询的界面的显示,包括滚动列表类(ListView)界面、画廊类(Gallary)界面,典型列表界面包括有:微信会话列表界面、微信会话界面、微信朋友圈界面、手机电话联系人界面、手机短信列表界面等等。

在已有的列表类界面的显示方案中,以Android系统的SDK(Software Development Kit,软件开发工具包)自带的实现为例,数据库在执行完查询过程并返回Cursor(Android SDK中的用于读取数据库的数据库抽象接口)后,会在匿名共享内存(ashmem)分配一个固定大小的缓冲区(Cursor Window),并往Cursor Window内填充查询结果数据,直到缓冲区被占满或者没有更多的结果输出。填充了数据的Cursor返回后,可以和Adapter(Android SDK中用于绑定列表类控件与Cursor的组件)绑定。在滚动列表时,列表控件通过Adapter->Cursor->Cursor Window的路径取得对应位置的数据,例如在列表滚动到第10行时,取出Cursor Window第10行的数据。Cursor Window长度固定,若结果集非常大,则只能缓存前面一部分。如果显示界面滑动到缓存部分以外,Cursor Window里没有对应位置的数据,则清空整个缓冲区并重新查询,填充后面的数据。

然而,由于缓冲区为固定长度,而不同的查询结果集的长度不一,在结果集较小的情况下会浪费大量内存空间。而且在首次查询时,需要先填充满缓冲区或者缓存完结果集的所有条目,才能用于界面显示,填充时间长,不仅造成界面卡顿,Loading等待时间也长。

为此,在本发明实施例方案中,结合主线程和工作线程两个线程完成用于列表类界面显示的数据查询过程,查询过程始终在工作线程进行,不占用主线程,而且工作线程在查询较少的数据之后即返回给主线程进行渲染显示,以减少初始打开界面时的界面卡顿现象,然后继续查询数据用以进行数据显示。之后随着界面的滚动,基于主线程的数据请求,工作线程会继续遍历查询并填充到缓冲区,以提供后续的数据。其中,在一个示例中,工作线程可以始终持有Prepared Statement(SQLite(一种广泛用于移动终端和客户端的轻量级文件数据库)提供的用于读取数据库数据的接口),从而在遍历更多数据时可以无需重新查询。

基于此,结合图3所示的主线程和工作线程之间的交互关系的示意图,一个示例中的完整的界面显示过程中的数据查询过程可以是如下所述。需要说明的是,在图3所示中,在主线程或工作线程的工作处理流程中,无灰色方框的部分表示处于等待状态。

如图3所示,主线程在进入列表类显示界面时,首先向工作线程发送一个查询请求。工作线程在接收到该查询请求后,会做查询准备工作,该查询准备工作包括:编译SQL(Structured Query Language,结构化查询语言)语句、申请缓冲区等,查询初始长度数据,该初始长度数据是数据集很小的一个开头部分,例如前16行数据。在工作线程的查询准备的过程中,主线程必须等待,但由于本身初始长度数据的数据量较小,因此主线程等待的时间一般也较短。

工作线程在成功将开头的初始长度数据填入缓冲区之后,向主线程返回数据库读取抽象接口Cursor,同时可向主线程返回申请得到的缓冲区的索引标识。工作线程向主线程返回数据库读取抽象接口之后,不停顿,继续往下查询接下来部分的数据,并将查询获得的数据填充缓冲区,直至查询到初始长度数据之后的第一长度数据。其中,该第一长度数据可以结合实际技术应用设定,一个示例中的第一长度数据结合上述初始长度数据可以填满上述缓冲区,即工作线程会一直查询直至填满缓冲区。另一个示例中的第一长度数据可以是一个预设的临界点,例如主线程进入的列表类显示界面的列表可见部分以下的一定数目行数据。在查询到初始长度数据之后的第一长度数据并填充到缓冲区之后,工作线程进入睡眠状态,等待主线程发送新的位置请求。

主线程在接收到工作线程返回的数据库读取抽象接口之后,根据数据库读取抽象接口从缓冲区读取初始长度数据,并用读取到的初始长度数据渲染列表,此时,显示界面的列表只有开头大部分是可见的,如前16行数据。

在主线程进入的列表类显示界面的列表可见部分的数据位置信息大于初始长度数据的位置信息时,例如列表可见部分的是24行数据,而初始长度数据是如前所述的前16行数据,则主线程向工作线程发送一个数据请求,该数据请求中携带上述数据位置信息,即需要的行数,随后主线程会停下等待。

工作线程在接收到该数据请求后,记录该数据请求中的数据位置信息,即记录主线程需要的行数,继续遍历数据并填充至缓冲区,填充至缓冲区的结果集一旦覆盖了上述数据位置信息,即覆盖了主线程需要的行数时,则工作线程向主线程发送通知消息,唤醒主线程继续完成渲染过程。

主线程接收到工作线程返回的通知消息后,会根据上述数据库读取抽象接口从缓冲区读取对应的数据,并进行渲染。

需要说明的是,工作线程在接收到该数据请求后,若该数据请求中的数据位置信息对应的数据已经填充至缓冲区,则工作线程可以直接向主线程返回通知消息。

在列表类显示界面的显示过程中,用户可能会滚动列表界面,主线程在接收到界面滚动指令之后,滚动并绘制滚动后列表界面。若滚动后需要绘制的部分可用,即缓冲区中已填充对应的数据,则可以直接从缓冲区中提取数据进行渲染绘制。如果滚动后需要绘制的部分不可用,即缓冲区未填充有对应的数据,则主线程停下来等待,将滚动后列表界面的当前可见部分的最大位置信息作为所述数据位置信息,向工作线程发送所述数据请求。在此同时,主线程还可以提高工作线程的调度优先级,使得工作线程可以尽快将需要的数据填充到缓冲区,进一步减少卡顿现象。

工作线程接收到该数据请求后,记录该数据请求中的数据位置信息,即记录主线程需要的行数,遍历数据并填充至缓冲区,填充至缓冲区的结果集一旦覆盖了上述数据位置信息,则工作线程向主线程发送通知消息,唤醒主线程继续完成渲染过程。

一个示例中,工作线程可以仅将上述数据位置信息对应的数据填充至缓冲区。由于在界面显示过程中,极有可能进行滚动显示,为了避免后续滚动时可能需要等待,因此,在另一个示例中,工作线程将上述数据位置信息对应的数据填充至缓冲区之后,还可以进一步遍历接下来的一定长度的数据存入缓冲区中,该长度可以结合实际技术需要进行设定,例如可以通过统计用户的滚动行为设置该长度。

主线程在接收到工作线程返回的通知消息后,会根据上述数据库读取抽象接口从缓冲区读取对应的数据,并进行渲染,同时可以将工作线程的调度优先级设置为默认优先级,即将工作线程的调度优先级调整回原来的调度优先级。

在一个示例中,工作线程在所述数据位置信息对应的数据量超过缓冲区容量时,可以丢弃缓冲区最前面的块,例如缓冲区的前第二长度数据,以腾出空间,再将查询获得的数据填充所述缓冲区,以确保缓冲区中缓存的是最新请求的数据。

需要说明的是,图3所示中,工作线程可能会睡眠状态并进行等待的时间,在实际技术应用中,如果列表滚动的速度或者说主线程发送数据请求的速度大于工作线程填充数据的速度,则工作线程将会一直在追赶列表滚动而不会进入睡眠状态。

由于工作线程会将更早的数据从缓冲区清除,而在列表类界面的显示过程中,用户可能会向上滚动,即可能会需要重新将之前已经显示过的数据重新渲染显示。在显示列表出现往上滚动时,主线程会根据滚动到的位置向工作线程发送数据请求,该数据请求会携带滚动后的数据位置信息。

在此情况下,工作线程接收到的是递减的位置请求,即当前接收到的数据请求中的数据位置信息小于上一次的数据请求中的位置信息,由于工作线程会将更早的数据从缓冲区清除,因此,工作线程会先检查数据位置信息对应的数据是否在缓冲区内。如果仍在缓冲区内,则工作线程可以不作处理,主线程可以从缓冲区获得对应的数据进行渲染显示。如果数据位置信息对应的数据不在缓冲区内,即请求位置已经被丢弃,则可以从初始位置遍历数据,并在遍历到所述数据位置信息对应的数据或者所述数据位置信息的前第三长度数据时,开始将遍历到的数据填充到缓冲区。其中,由于接收到了递减的数据位置信息,因此,工作线程可以暂停往下遍历数据的工作,提前进入休眠状态。

上述滚动过程中请求数据的过程,可以循环重复的进行。在完成了整个的列表显示的过程之后,在离开列表界面时,主线程向工作线程发送退出请求通知,工作线程接收退出请求通知之后关闭查询并释放缓冲区,从而完成列表类界面显示的退出过程的处理。

其中,上述示例中的缓冲区,可以采用分块缓冲区来实现,以更有益于删除缓冲区数据和动态调整缓冲区大小,其中,每个分块缓冲区的可以为固定大小,即具有相同的字节大小,此时,每个分块缓冲区可以视为容量较小的Cursor Window,例如256KB。由于每一行数据的大小可能不同,所占用的空间也不一样,因此,在各分块缓冲区的大小相同的情况下,所能容纳的行数也可能会有不同。另一方面,各分块缓冲区的大小也可以不相同。图4中示出了一个示例中的分块缓冲区的示意图,对于每个分块缓冲区,可记录每个分块缓冲区的起始位置和结束位置,对于每个分块缓冲区而言,可以用该分块缓冲区的起始位置作为该分块缓冲区的索引。

在此情况下,在上述示例的方案中,可以根据记录的分块缓冲区的起始位置和结束位置,获取各分块缓冲区,此时,上述缓冲区包括获取的各分块缓冲区,获取得到的各分块缓冲区的标识,可以加入到缓冲区索引标识,即缓冲区索引标识包括各分块缓冲区的索引标识,该缓冲区索引标识可以由工作线程返回给主线程,也可以是与数据库读取抽象接口相绑定。

另一方面,在上述实施例的方案中,当需要更多的缓冲区时,即缓冲区需要增长时,可以分配一个新的分块缓冲区并加入到缓冲区索引标识。在一个示例中,工作线程在基于主线程的数据请求向其返回通知消息时,如果该请求的数据是在新添加的分块缓冲区中,则可以将该分块缓冲区的标识返回给主线程,即可以在通知消息中携带分块缓冲区的索引标识。在另一个示例中,工作线程也可以直接将该分块缓冲区的索引标识与数据库读取抽象接口相绑定,从而主线程可以基于该数据库读取抽象接口即可从新添加的分块缓冲区获得数据并进行渲染。此外,当需要删除较早的数据、腾出部分空间时,删除对应位置的缓冲区的分块即可。

基于分块缓冲区的方式,在开始进行数据查询时,可以只申请一个块,并随着数据遍历过程,动态申请更多的分块缓冲区,并将申请得到的各分块缓冲区并在逻辑上连接起来,以达到按需分配内存的目的,使得小的结果集只占用较少的内存,而大的结果集可以有更大的可以完全缓存的可能性。而且,通过分块缓冲区的方式,在滑动过程中列表滑动到缓冲区之外时,可以无需丢弃整个结果集,只需要丢弃时间最早的或者说存储的数据的位置最早的一个分块缓冲区,从而大幅提高了往回滚动时数据仍在缓冲区内的几率,提高了列表类显示界面的性能。

另一方面,由于数据库是一个多用户共享的资源,为了处理并发问题会采用数据库锁机制,因此,在上述实施例的数据查询方法的执行过程中,工作线程可能会一直持有未关闭的Prepared Statement,因而会一直持有数据库的读锁,并占用数据库连接池的一个连接,可能会导致其他数据库操作无法顺利进行。因此,在一个示例中,可以在工作线程持有数据库数据读取接口Prepared Statement时,注册一个接口到连接池或者SQLite等待回调接口,一旦出现锁争抢,工作线程可以基于不同的策略确定是继续持有锁暂时阻止其他数据库操作,还是暂时放弃锁允许其他数据库操作。一个示例中的策略包括:在主线程处于等待状态时,即主线程发送的数据请求中的数据位置信息对应的数据未在缓冲区,则继续持有锁;若未填充到请求位置临界点,如已经将主线程发送的数据请求中的数据位置信息对应的数据填充到了缓冲区,但尚未将该数据位置信息之后的一定数目的数据填充到缓冲区,或者是尚未将上述第一长度数据填充到缓冲区则继续持有锁;若工作线程处于等待状态或者说睡眠状态,则暂时放弃锁。当然,在其他实施例中,也可以做其他的策略设定。

基于本实施例中的数据查询方案,可以优化使用数据库查询的列表类界面的响应速度和流畅性,优化了数据量比较大的查询结果集的优化效果。

需要说明的是,上述示例中中是以Android平台为例进行说明,本领域技术人员可以理解的是,本实施例的方案同样也可以适用于其他平台的客户端。

基于与上述方法相同的思想,图5示出了一个实施例中的用于列表类界面显示的数据查询装置的结构示意图。如图5所示,该实施例中的装置包括:

主线程模块501,在进入列表类显示界面时,向工作线程模块发送查询请求,并根据工作线程模块返回的数据库读取抽象接口从缓冲区读取初始长度数据,并根据读取的初始长度数据渲染列表,并向工作线程模块发送数据请求,数据请求携带数据位置信息;

工作线程模块502,根据所述查询请求进行查询,获取缓冲区以及初始长度数据,将获取的初始长度数据填入所述缓冲区后,向主线程模块返回数据库读取抽象接口,并查询所述初始长度数据之后的第一长度数据,将查询获得的第一长度数据填入所述缓冲区;并接收所述数据请求,在缓冲区没有所述数据位置信息对应的数据时,记录所述数据位置信息,并在填入缓冲区的数据覆盖所述数据位置信息时,向主线程模块发送通知消息。

可以理解,这里的主线程模块501对应于上述主线程,工作线程模块502对应于上述工作线程。基于本实施例的方案,结合主线程和工作线程两个线程完成用于列表类界面显示的数据查询过程,查询过程始终在工作线程进行,不占用主线程,主线程在进入列表类显示界面时,向工作线程发送查询请求,工作线程接收到该查询请求后,无需等待缓冲区填满,获得缓冲区和较小的初始长度数据之后,先将缓冲区和较小的初始长度数据返回给主线程进行显示,且工作线程向主线程返回初始长度数据之后,会继续查询初始长度数据之后的第一长度数据,从而使得主线程可以用初始长度数据进行初始界面显示,且可以尽快从工作线程获得新的查询数据用以界面显示,使得列表类界面的显示不再卡顿。

在一个示例中,工作线程模块502在将查询获得的第一长度数据填入所述缓冲区之后,可以进入睡眠状态,直至接收到主线程模块501发送的所述数据请求。

上述主线程模块501向工作线程模块502发送的数据请求,可以是在任何需要进一步请求数据时进行发送。

在一个示例中,主线程模块501可以在进入的列表类显示界面的列表可见部分的所述数据位置信息大于所述初始长度数据的位置信息时,向工作线程模块502发送所述数据请求。从而,主线程模块501在获得初始长度数据进行渲染显示之后,如果初始长度数据无法渲染全部的初始显示界面,即可见部分的位置信息大于初始长度数据的位置信息,则向工作线程模块502发送数据请求,以获得更多的数据进行当前显示界面的显示。

另一方面,主线程模块501也可以在滚动的过程中向工作线程模块502发送上述数据请求,以请求新的数据进行渲染显示。此时主线程模块501,在接收到界面滚动指令时,滚动并绘制滚动后列表界面,将滚动后列表界面的当前可见部分的最大位置信息作为所述数据位置信息,向工作线程模块502发送所述数据请求。

其中,主线程模块501在向工作线程模块502发送所述数据请求后,可以在满足调度优先级调整条件时,提高工作线程模块502的调度优先级。从而,在主线程模块501向工作线程模块502发送数据请求后,如果工作线程模块502已经将工作将上述数据位置信息对应的数据填充到缓冲区,则主线程模块501可以直接从缓冲区拿到数据进行渲染。如果工作线程模块502尚未将数据位置信息对应的数据填充到缓冲区,则主线程模块501需要等待。此时,主线程模块501通过提高工作线程模块502的调度优先级,可以使得工作线程模块502可以尽快将需要的数据填充到缓冲区,进一步减少卡顿现象。

其中,这里的调度优先级调整条件,可以结合实际需要进行设置。一个示例中,主线程模块501可以是在向工作线程模块502发送数据请求之后,在预定时间段内未接收到工作线程模块502返回的通知消息时,判定满足调度优先级调整条件。在另一个示例中,由于上述工作线程模块502已经向主线程模块501返回了缓冲区索引标识,因此,主线程模块501在向工作线程模块502发送数据请求之后,可以先尝试从缓冲区索引标识对应的缓冲区读取对应的数据,若未读取到对应的数据,则判定满足调度优先级调整条件。在其他示例中,对调度优先级调整条件,也可以做其他不同的设定。

在上述提高了工作线程的调度优先级之后,主线程模块501还可以在接收到工作线程模块502返回的上述通知消息时,将工作线程模块502的调度优先级设置为默认优先级,即将工作线程模块502的调度优先级调整回原来的调度优先级。

由于在列表类界面显示的过程中,由于主线程模块501可能会基于不断的滚动过程,不断地查询新的数据进行显示,而缓冲区的容量本身是有限的。因此,在一个示例中,工作线程模块502在所述数据位置信息对应的数据量超过缓冲区容量时,可以丢弃缓冲区的前第二长度数据后,再将查询获得的数据填充所述缓冲区,以确保缓冲区中缓存的是最新请求的数据。

主线程模块501在离开列表界面时,向工作线程模块502发送退出请求通知,工作线程模块502接收退出请求通知之后关闭查询并释放缓冲区,从而完成列表类界面显示的退出过程的处理。

在本示例的方案中,缓冲区可以由分块缓冲区来实现,其中,各分块缓冲区的大小可以相同,也可以不相同。每个分块缓冲区均可以有起始位置和结束位置,在需要填充新的数据、增长缓冲区时,分配一个新的分块缓冲区并将该分块缓冲区的标识添加到上述缓冲区索引标识即可。从而工作线程模块502,可以根据记录的分块缓冲区的起始位置和结束位置,获取各分块缓冲区,所述缓冲区包括获取的各分块缓冲区,各分块缓冲区的大小相同或不同。在此情况下,在需要删除缓冲区的数据时,可以直接删除对应位置的分块缓冲区即可。

基于如上所述的示例,在一个实施例中还提供一种计算机设备,该计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现如上述各实施例中的任意一种用于列表类界面显示的数据查询方法。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性的计算机可读取存储介质中,如本发明实施例中,该程序可存储于计算机系统的存储介质中,并被该计算机系统中的至少一个处理器执行,以实现包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。

据此,在一个实施例中还提供一种存储介质,其上存储有计算机程序,其中,该程序被处理器执行时实现如上述各实施例中的任意一种用于列表类界面显示的数据查询方法。

以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1