具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参见图1,在一个实施例中,提供了一种图片缩略图显示方法,本方法以应用在安装有各种操作系统的终端中进行举例说明,这些终端包括但不限于台式计算机、个人数字助理、智能手机、平板电脑和膝上型电脑等,包括:
步骤102,第一线程启动第二线程和第三线程。
本实施例中,第一线程、第二线程和第三线程可以是多线程系统平台下的三个独立线程。其中,第一线程可以是用于实现用户界面的线程,例如,GUI(GUI,GraphicalUserInterface,图形用户界面)线程或UI(UI,UserInterface,用户界面)线程。以Android系统为例,第一线程则可以是主线程,主线程在启动后先进行初始化,包括用户界面、视图显示控件、存储文件列表、缩略图缓存的初始化。之后,第一线程启动第二线程和第三线程,第二线程用于文件扫描,第三线程用于加载图片缩略图。
步骤104,第二线程对终端进行图片文件扫描,得到待显示的图片文件列表,并发送至第一线程。
第二线程获取终端中所要扫描的文件目录,该目录可以是第一线程指定的目录。扫描时,第二线程根据文件的后缀识别图片文件,将图片文件记录到中间变量表中,每隔一定时间将累积的中间变量表作为待显示的图片文件列表发给第一线程。
步骤106,第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图。
第一线程获取第二线程扫描到的待显示的图片文件列表后,可生成图片缩略图加载请求,并将该请求发送至第三线程。
步骤108,第三线程获取各待显示的图片文件对应的缩略图数据,并将缩略图数据返回至第一线程。
第三线程经第一线程启动后,处于空闲等待状态。当第三线程接收到第一线程发来的图片缩略图加载请求后,根据图片缩略图加载请求对各待显示的图片文件进行图片缩略图加载处理,得到各图片文件对应的缩略图数据,并返回至第一线程。
步骤110,第一线程根据缩略图数据,通过视图显示控件显示待显示的图片文件对应的缩略图。
第一线程获取图片文件对应的缩略图数据,并通过用户界面的视图显示控件显示图片缩略图,从而更新用户界面。以Android平台为例,视图显示控件包括GridView(网格视图)控件和ListView(列表视图)控件。网格视图控件和列表视图控件所显示的视图包含多个子视图,其中,网格视图控件可以用于显示桌面图标等网格型视图,而列表视图控件可以用于列表类型的视图,如联系人列表等。
本实施例中,通过第二线程进行文件扫描,得到待显示的图片文件列表,第一线程根据第二线程扫描到的待显示的图片文件列表,向第三线程请求加载图片缩略图,再由第三线程加载图片缩略图,得到缩略图数据并返回第一线程,最终由第一线程显示缩略图,相比于现有技术,由于不同的线程来处理文件的扫描、图片缩略图的加载和缩略图的显示,使得扫描存储器上图片文件这一计算量较大的工作和加载图片缩略图这一计算量较大的工作分别交由了一个独立的线程来完成,降低了第一线程的工作负担,实现了对图片缩略图进行异步加载处理,减少了卡顿现象,提高图片缩略图显示的流畅性。
如图2所示,在另一个实施例中,一种图片缩略图显示方法,包括:
步骤202,第一线程启动第二线程和第三线程。
在一个实施例中,第一线程在启动第二线程和第三线程之前,可进行初始化,包括初始化用户界面、视图显示控件、存储文件列表和缩略图缓存等。其中,存储文件列表中每一项为文件项,其包含一个用来唯一标识文件项的索引值,缩略图缓存中缓存了缩略图数据,其中,缩略图数据是以键值对的形式进行存储,每一个缩略图数据对应了一个索引值,该索引值即为用来唯一标识文件项的索引值,根据该索引值即可得到对应的缩略图数据。缩略图数据可以是图片的缩略图进行解码后的位图数据,也可以是用来表示位图的数据结构。
以本实施例所提供的方法应用安装了Android系统的移动终端为例,第一线程可以是Android系统中的主线程,存储文件列表(FileList)中每一项为文件项(FileItem项),包含一个唯一标识该文件项的索引值(Key值)。在Android系统中,缩略图缓存以CacheMap<Key,Value>的数据结构存储数据,其中的Key值对应于图片文件的文件项中索引值;CacheMap<Key,Value>中的值Value为图片文件对应的缩略图数据,包括类似位图(Bitmap)或BitmapDrawable(Android系统上一种表示位图的数据结构)一类的数据结构。初始化之后,主线程启动第二线程和第三线程,第二线程用于文件扫描,第三线程用于加载图片缩略图。
步骤204,第二线程对终端进行图片文件扫描,得到待显示的图片文件列表,并发送至第一线程。
第二线程根据第一线程指定的文件目录对终端进行图片文件扫描。扫描时,第二线程根据文件的后缀识别图片文件,将图片文件记录到中间变量表中,每隔一定时间(例如300ms)将累积的中间变量表作为待显示的图片文件列表,通过第一线程的消息处理函数发给第一线程,例如在Android系统中,消息处理函数可以是主线程的某一Handler的消息处理函数,Handler:一种运行在Android系统中,能够对线程里的消息循环进行消息处理的一种对象,它通过消息对象(Message对象)来传递消息。
步骤206,第一线程检测缩略图缓存中是否包含待显示的图片文件对应的缩略图数据。若是,执行步骤208,否则执行步骤210。
第一线程提取第二线程扫描到的待显示的图片文件列表,将图片文件列表更新到存储文件列表中。通过网格视图控件或列表视图控件的适配器(Adapter)的通知数据变化函数(在Android系统中,该函数为notifyDataChange函数)告知用户界面底层数据发生了变化,需要更新显示用户界面。第一线程通过适配器依次通过获取视图函数(例如在Android系统中,该函数为getview函数)获取网格视图控件或列表视图控件所要显示每个子视图对应的视图项(ViewItem)和文件项中的索引值。例如在Android系统中,通过视图项在存储文件列表(FileList)中的下标(position),通过该下标,从存储文件列表中找到对应的文件项,进而获取到文件项对应的索引值(Key值)。视图项包括缩略图数据和视图显示控件创建的其它视图元素,如边框、按钮等。第一线程根据索引值检索缩略图缓存,若能检索到对应的索引值,意味着图片的缩略图数据已经存在缩略图缓存中,执行步骤208。若检索不到对应的索引值,意味着图片的缩略图数据没有存于缩略图缓存中,执行步骤210。
步骤208,第一线程从缩略图缓存中获取待显示的图片文件对应的缩略图数据,并根据缩略图数据,通过视图显示控件显示缩略图。
第一线程获取缩略图数据,结合视图显示控件创建的其它视图元素,作为图片文件对应的视图项。适配器(Adapter)通过获取视图函数获得该视图项,更新到网格视图控件或列表视图控件所要显示的对应子视图中,从而显示了图片缩略图。
步骤210,第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图。
第一线程没有在缩略图缓存中检索到图片文件的缩略图数据后,需要请求第三线程加载图片缩略图加载,以获取图片文件对应的缩略图数据。第一线程构造一个任务模型(如Android系统中的ThumbLoadTask模型)作为图片缩略图加载请求,该任务模型包含了要进行图片缩略图加载处理的图片文件的文件项。同时,主线程通过视图显示控件的标签设置函数(如Android系统中的setViewByTag函数)为图片文件的视图项设置一个唯一的标签,该标签可以但不限于是图片文件文件项中的索引值,用于将后续第三线程返回的缩略图数据与视图项相对应。
步骤212,第三线程获取待显示的图片文件对应的缩略图数据,并将所述缩略图数据返回至所述第一线程。
第三线程经第一线程启动后,处于空闲等待状态。当第三线程接收到第一线程发来的图片缩略图加载请求后,根据图片缩略图加载请求对需要进行缩略图加载处理的图片文件进行图片缩略图加载处理,得到该图片文件对应的缩略图数据。第三线程再通过第一线程的消息处理函数,将图片文件的缩略图数据、索引值以及文件项发送给第一线程。
步骤214,第一线程根据缩略图数据,通过视图显示控件显示待显示的图片文件对应的缩略图。
在一个实施例中,第一线程从第三线程返回的消息中,提取图片文件对应的文件项、索引值和缩略图数据后,第一线程还可以将缩略图数据存储至缩略图缓存中,例如在Android系统中,第一线程将缩略图存储至缩略图缓存中,相应更新CacheMap<Key,Value>数据结构。
第一线程调用视图显示控件的通过标签查找视图函数(例如,在Android系统中,该函数为网格视图控件或列表视图控件的findViewByTag函数),以图片文件文件项的索引值为该函数的标签,找到缩略图数据对应的视图项,之后视图显示控件将视图项更新到对应的子视图中,从而显示了图片缩略图。
在一个实施例中,第一线程还可以实时监控视图显示控件的显示区域和缩略图缓存,若视图显示控件的显示区域发生滚动时,缩略图缓存中缓存有显示区域外的图片文件的缩略图数据,则第一线程删除显示区域外的图片文件在缩略图缓存中的缩略图数据,从而回收了部分缓存。
本实施例中,通过第一线程接收第二线程扫描到待显示的图片文件列表,判断其中的图片文件的缩略图数据是否已经存在缓存中,若已经存在就直接调用视图显示控件进行显示,减少了第三线程进行图片缩略图加载处理的工作量,进一步提高了图片缩略图显示的效率,并且第一线程还对视图显示控件的显示区域和缩略图缓存进行监控,当显示区域发生滚动,就回收显示区域之外的图片文件缩略图数据所占用的缓存,大大减少了显示图片缩略图处理过程中所占用的缓存。
参见图3,在一个实施例中,第三线程获取待显示的图片文件的缩略图数据,包括:
步骤302,第三线程接收到第一线程发送的加载图片缩略图请求。
步骤304,第三线程检测是否存储有待显示的图片文件对应的缩略图。若是,执行步骤306,否则执行步骤308。
步骤306,第三线程加载存储的缩略图,并对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据。
如果图片文件对应的缩略图已预先进行过存储,则第三线程直接加载缩略图,并对加载的缩略图进行解码,得到缩略图数据。
步骤308,第三线程创建待显示的图片文件对应的缩略图,并存储缩略图,以及加载创建的缩略图,并对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据。
第三线程创建图片文件对应的缩略图,并将缩略图进行存储,例如在Android系统中,可以将缩略图存于存储卡中的指定文件中,以便后续第三线程加载该图片文件的缩略图时,直接读取已经存储的缩略图。之后,第三线程对创建的缩略图进行加载并进行解码,得到图片文件对应的缩略图数据。
在本实施例中,第三线程对加载图片缩略图请求中的图片文件的缩略图进行检测,如果缩略图不存在于系统的存储空间内,则先进行缩略图的创建和存储,而如果检测到缩略图已经存在于存储空间中,则直接对已存在的缩略图进行处理,相比于现有技术需要每次都创建临时存放的图片文件对应的缩略图,再进行处理,提高了第三线程进行图片缩略图加载处理的效率。
参见图4,在一个实施例中,提供了一种图片缩略图显示装置,包括:
第一线程402,用于启动第二线程404和第三线程406。
第二线程404,用于对终端进行图片文件扫描,得到待显示的图片文件列表,并发送至第一线程402。
本实施例中,第一线程402还用于根据待显示的图片文件列表,向第三线程406请求加载图片缩略图。
第三线程406,用于获取各待显示的图片文件对应的缩略图数据,并将缩略图数据返回至第一线程402。
本实施例中,第一线程402还用于根据缩略图数据,通过视图显示控件显示待显示的图片文件对应的缩略图。
在一个实施例中,第一线程402还用于检测缩略图缓存中是否包含待显示的图片文件对应的缩略图数据,若是,则从缩略图缓存中获取待显示的图片文件对应的缩略图数据,并根据缩略图数据,通过视图显示控件显示缩略图;否则根据待显示的图片文件列表,向第三线程406请求加载图片缩略图。
在一个实施例中,第一线程402用于在接收到缩略图数据后将缩略图数据存储至缩略图缓存中。
在一个实施例中,第三线程406用于检测是否存储有待显示的图片文件对应的缩略图,若是,则加载存储的缩略图,并对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据;若否,则创建待显示的图片文件对应的缩略图,并存储缩略图,以及加载创建的缩略图,对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据。
在一个实施例中,第一线程402还用于监控视图显示控件的显示区域和缩略图缓存,若缩略图缓存中缓存有显示区域外的图片文件的缩略图数据,则删除显示区域外的图片文件在缩略图缓存中的缩略图数据,从而回收了部分缓存。
图5示出了第一线程402、第二线程404和第三线程406之间的交互过程,具体包括:
(1)第一线程404初始化。具体包括:
第一线程在启动后先进行初始化,包括用户界面、视图显示控件、存储文件列表、缩略图缓存的初始化。
第一线程启动第二线程和第三线程。
第一线程启动第二线程和第三线程,第二线程用于文件扫描,第三线程用于加载图片缩略图。
(2)扫描。具体的,第二线程进行图片文件扫描,得到待显示的图片文件列表,并发送至第一线程。
第二线程获取所要扫描的文件目录,该目录可以是第一线程指定。扫描时,第二线程根据文件的后缀识别图片文件,将图片文件记录到中间变量表中,每隔一定时间将累积的中间变量表作为待显示的图片文件列表发给第一线程。
(3)请求加载。包括:第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图。
第一线程获取第二线程扫描到的待显示的图片文件列表后,可生成图片缩略图加载请求,并将该请求发送至第三线程。
(4)加载图片缩略图。具体包括:
第三线程经第一线程启动后,处于空闲等待状态。当第三线程接收到第一线程发来的图片缩略图加载请求后,根据图片缩略图加载请求对待显示的图片文件进行图片缩略图加载处理,得到图片文件对应的缩略图数据,并返回至第一线程。
(5)显示图片缩略图。
第一线程获取图片文件对应的缩略图数据,并通过用户界面的视图显示控件显示图片缩略图,从而更新用户界面。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,如本发明实施例中终端的存储介质中,该程序由终端中的至少一个处理器执行,以实现包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-OnlyMemory,ROM)或随机存储记忆体(RandomAccessMemory,RAM)等。
本发明实施例还提供了一种图片缩略图显示终端,如图5所示,为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该终端可以为包括手机、平板电脑、PDA(PersonalDigitalAssistant,个人数字助理)、POS(PointofSales,销售终端)、车载电脑等任意终端设备,以终端为手机为例:
图5示出的是与本发明实施例提供的终端相关的手机的部分结构的框图。参考图5,手机包括:射频(RadioFrequency,RF)电路1110、存储器1120、输入单元1130、显示单元1140、传感器1150、音频电路1160、无线通信模块1170、处理器1180、以及电源1190等部件,其中无线通信模块1170可以但不限于包括蓝牙(Bluetooth)模块、无线保真(wirelessfidelity,WiFi)模块、红外通信模块等。本领域技术人员可以理解,图5中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图5对手机的各个构成部件进行具体的介绍:
RF电路1110可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器1180处理;另外,将设计上行的数据发送给基站。通常,RF电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(LowNoiseAmplifier,LNA)、双工器等。此外,RF电路110还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(GlobalSystemofMobilecommunication,GSM)、通用分组无线服务(GeneralPacketRadioService,GPRS)、码分多址(CodeDivisionMultipleAccess,CDMA)、宽带码分多址(WidebandCodeDivisionMultipleAccess,WCDMA)、长期演进(LongTermEvolution,LTE))、电子邮件、短消息服务(ShortMessagingService,SMS)等。
存储器1120可用于存储软件程序以及模块,处理器1180通过运行存储在存储器1120的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。存储器1120可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器1120可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
输入单元1130可用于接收输入的数字或字符信息,以及产生与手机1100的用户设置以及功能控制有关的键信号输入。具体地,输入单元1130可包括触控面板1131以及其他输入设备1132。触控面板1131,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板1131上或在触控面板1131附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板1131可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器1180,并能接收处理器1180发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板1131。除了触控面板1131,输入单元1130还可以包括其他输入设备1132。具体地,其他输入设备1132可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元1140可用于显示由用户输入的信息或提供给用户的信息以及手机的各种菜单。显示单元1140可包括显示面板1141,可选的,可以采用液晶显示器(LiquidCrystalDisplay,LCD)、有机发光二极管(OrganicLight-EmittingDiode,OLED)等形式来配置显示面板1141。进一步的,触控面板1131可覆盖显示面板1141,当触控面板1131检测到在其上或附近的触摸操作后,传送给处理器1180以确定触摸事件的类型,随后处理器1180根据触摸事件的类型在显示面板1141上提供相应的视觉输出。虽然在图5中,触控面板1131与显示面板1141是作为两个独立的部件来实现手机的输入和输入功能,但是在某些实施例中,可以将触控面板1131与显示面板1141集成而实现手机的输入和输出功能。
手机1100还可包括至少一种传感器1150,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板1141的亮度,接近传感器可在手机移动到耳边时,关闭显示面板1141和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路1160、扬声器1161,传声器1162可提供用户与手机之间的音频接口。音频电路1160可将接收到的音频数据转换后的电信号,传输到扬声器1161,由扬声器1161转换为声音信号输出;另一方面,传声器1162将收集的声音信号转换为电信号,由音频电路1160接收后转换为音频数据,再将音频数据输出处理器1180处理后,经RF电路1110以发送给比如另一手机,或者将音频数据输出至存储器1120以便进一步处理。
WiFi属于短距离无线传输技术,手机通过无线通信模块1170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图5示出了无线通信模块1170,但是可以理解的是,其并不属于手机1100的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器1180是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器1120内的软件程序和/或模块,以及调用存储在存储器1120内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器1180可包括一个或多个处理单元;优选的,处理器1180可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器1180中。
手机1100还包括给各个部件供电的电源1190(比如电池),优选的,电源可以通过电源管理系统与处理器1180逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
尽管未示出,手机1100还可以包括摄像头、蓝牙模块等,在此不再赘述。
在本发明实施例中,该终端所包括的处理器1180还具有以下功能:
提供相互通讯的三个工作线程:第一线程、第二线程和第三线程。其中,第一线程启动第二线程和第三线程;第二线程进行图片文件扫描,得到待显示的图片文件列表,并发送至第一线程;第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图;第三线程获取待显示的图片文件对应的缩略图数据,并将缩略图数据返回至所述第一线程;第一线程根据缩略图数据,通过视图显示控件显示待显示的图片文件对应的缩略图。
在一个实施例中,该终端所包括的处理器1180还具有以下功能:
在第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图之前,第一线程检测缩略图缓存中是否包含待显示的图片文件对应的缩略图数据,若是,则第一线程从缩略图缓存中获取所述待显示的图片文件对应的缩略图数据,并根据缩略图数据,通过视图显示控件显示缩略图;否则进入第一线程根据待显示的图片文件列表,向第三线程请求加载图片缩略图的步骤。
在一个实施例中,该终端所包括的处理器1180还具有以下功能:
在第三线程获取待显示的图片文件对应的缩略图数据,并将所述缩略图数据返回至所述第一线程之后,第一线程将缩略图数据存储至缩略图缓存中。
在一个实施例中,该终端所包括的处理器1180还具有以下功能:
第三线程检测是否存储有所述待显示的图片文件对应的缩略图,若是,则第三线程加载存储的缩略图,并对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据;若否,则第三线程创建待显示的图片文件对应的缩略图,并存储缩略图,以及加载创建的缩略图,并对加载的缩略图进行解码,得到待显示的图片文件对应的缩略图数据。
在一个实施例中,该终端所包括的处理器1180还具有以下功能:
第一线程监控视图显示控件的显示区域和缩略图缓存,若缩略图缓存中缓存有显示区域外的图片文件的缩略图数据,则第一线程删除显示区域外的图片文件在缩略图缓存中的缩略图数据。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。