调用弹窗控件的处理方法、装置及电子设备
技术领域
本发明涉及应用程序技术领域,尤其涉及一种调用弹窗控件的处理方法、装置及电子设备。
背景技术
Android弹窗(Dialog):是指Android系统提供的,用于提示用户作出决定或输入额外信息的小窗口。
内存泄漏(Memory Leak):指的是程序在申请内存空间之后,无法释放已占有的空间,内存泄漏的堆积会导致内存溢出。
内存溢出(OutOfMemory):指的是应用程序申请内存的时候,没有足够的内存空间分配,导致应用程序崩溃。
在Android应用程序开发中,弹窗是一个非常常用的控件,几乎所有的应用程序都使用了弹窗控件。然而,在Android 5.0之前版本的系统中,在使用原生弹窗时,如果调用了弹窗的setOnDismissListener()等方法,可能会引起内存泄漏,内存泄漏会造成应用程序卡顿,内存泄露堆积后会导致内存溢出,从而导致程序崩溃,影响用户体验。目前需要一种通用性强、可维护性好的方法,以解决在使用弹窗控件时引起内存泄漏的问题。
发明内容
本发明旨在至少在一定程度上解决相关技术中的技术问题之一。
为此,本发明的第一个目的在于提出一种调用弹窗控件的处理方法,以实现释放弹窗引用的外部对象,解决了弹窗内存泄漏问题,通用性可维护性好。
本发明的第二个目的在于提出一种调用弹窗控件的处理装置。
本发明的第三个目的在于提出一种电子设备。
本发明的第四个目的在于提出一种非临时性计算机可读存储介质。
本发明第一方面实施例提出了一种调用弹窗控件的处理方法,包括:
获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听所述弹窗控件的消失事件;
若获取到所述弹窗控件的消失事件,则调用反射方法获取所述弹窗控件引用的外部对象的私有变量值;
判断所述私有变量值是否为空,若获知所述私有变量值不为空,则释放所述弹窗控件引用的外部对象。
本发明实施例的调用弹窗控件的处理方法,通过获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。进而,若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。进一步,判断私有变量值是否为空,若获知私有变量值不为空,则释放弹窗控件引用的外部对象。由此,实现了释放弹窗的外部对象,解决了Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题,通用性可维护性好,降低了开发成本。
另外,根据本发明上述实施例的调用弹窗控件的处理方法还可以具有如下附加技术特征:
可选地,在所述判断所述私有变量值是否为空之后,还包括:若获知所述私有变量值为空,则调用所述反射方法赋予所述私有变量值为空。
可选地,在获取调用对象发送的对预先封装的弹窗控件的调用指令之后,还包括:
根据所述调用指令判断所述弹窗控件是否调用Dismiss方法;若是,则将所述弹窗控件的对象设置为空。
可选地,在所述若获取到所述弹窗控件的消失事件之后,还包括:向所述调用对象发送所述弹窗控件的消失通知。
可选地,在所述获取调用对象发送的对预先封装的弹窗控件的调用指令之前,还包括:根据所述弹窗控件的消失监听事件和引用对象释放事件封装所述弹窗控件。
本发明第二方面实施例提出了一种调用弹窗控件的处理装置,包括:
处理模块,用于获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听所述弹窗控件的消失事件;
获取模块,用于若获取到所述弹窗控件的消失事件,则调用反射方法获取所述弹窗控件引用的外部对象的私有变量值;
判断模块,用于判断所述私有变量值是否为空;
释放模块,用于若获知所述私有变量值不为空,则释放所述弹窗控件引用的外部对象。
本发明实施例的调用弹窗控件的处理装置,通过获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。进而,若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。进一步,判断私有变量值是否为空,若获知私有变量值不为空,则释放弹窗控件引用的外部对象。由此,实现了释放弹窗的外部对象,解决了Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题,通用性可维护性好,降低了开发成本。
另外,根据本发明上述实施例的调用弹窗控件的处理装置还可以具有如下附加技术特征:
可选地,所述释放模块还用于:若获知所述私有变量值为空,则调用所述反射方法赋予所述私有变量值为空。
可选地,所述处理模块还用于:根据所述调用指令判断所述弹窗控件是否调用Dismiss方法;若是,则将所述弹窗控件的对象设置为空。
可选地,所述的装置还包括:通知模块,用于向所述调用对象发送所述弹窗控件的消失通知。
可选地,所述的装置还包括:封装模块,用于根据所述弹窗控件的消失监听事件和引用对象释放事件封装所述弹窗控件。
本发明第三方面实施例提出了一种电子设备,包括处理器和存储器;其中,所述处理器通过读取所述存储器中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于实现如第一方面实施例所述的调用弹窗控件的处理方法。
本发明第四方面实施例提出了一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如第一方面实施例所述的调用弹窗控件的处理方法。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
图1为本发明实施例所提供的一种调用弹窗控件的处理方法的流程示意图;
图2为本发明实施例所提供的另一种调用弹窗控件的处理方法的流程示意图;
图3为本发明实施例所提供的一种释放弹窗控件引用的外部对象的流程示意图;
图4为本发明实施例所提供的一种调用弹窗控件的处理装置的结构示意图;
图5为本发明实施例所提供的另一种调用弹窗控件的处理装置的结构示意图;
图6示出了适于用来实现本发明实施例的示例性电子设备的框图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
下面参考附图描述本发明实施例的调用弹窗控件的处理方法、装置及电子设备。
图1为本发明实施例所提供的一种调用弹窗控件的处理方法的流程示意图,如图1所示,该调用弹窗控件的处理方法包括:
步骤101,获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。
本实施例中,可以预先封装弹窗控件,进而,在调用弹窗控件时,可以获取调用对象发送的对该弹窗控件的调用指令,并监听弹窗控件的消失事件。
作为一种可能的实现方式,可以根据弹窗控件的消失监听事件和引用对象释放事件预先封装弹窗控件。进而,在调用弹窗控件时,可以获取调用对象发送的对弹窗控件的调用指令,例如,在调用弹窗的setOnDismissListener()方法时,由调用对象发送相应的调用指令,进而获取该调用指令,以根据调用指令执行对弹窗控件的调用。
其中,调用指令包括但不限于对setOnDismissListener()方法、setOnShowListener()方法、setOnCancelListener()方法的调用指令,此处不作限制。
作为一种可能的实现方式,可以根据预先封装的弹窗控件的消失监听事件,监听弹窗控件的消失事件。
作为一种示例,可以根据innerListener封装弹窗控件,进而,在调用弹窗控件时,通过innerListener监听弹窗的消失事件。
作为另一种示例,可以根据mDismissListener封装弹窗控件,进而,在调用弹窗控件时,通过mDismissListener监听弹窗的消失事件。
其中,弹窗控件的监听消失事件包括但不限于mDismissListener和innerListener,此处不作限制。
步骤102,若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。
在本发明的一个实施例中,调用弹窗控件时会引用外部对象例如Message对象,由于弹窗控件引用的Message对象是私有变量,无法直接访问,因此,在获取到弹窗控件的消失事件时,可以调用反射方法获取弹窗控件引用的外部对象的私有变量值。
作为一种示例,可以调用反射方法获取私有变量,并通过get方法获取该私有变量的私有变量值。
步骤103,判断私有变量值是否为空,若获知私有变量值不为空,则释放弹窗控件引用的外部对象。
在本发明的一个实施例中,在获取弹窗控件引用的外部对象的私有变量值之后,可以判断该私有变量值是否为空。进而,当私有变量值不为空时,可以调用该私有变量的recycle方法释放该私有变量值,并通过反射方法将私有变量值赋值为空,从而实现释放弹窗控件引用的外部对象。
可以理解,在Android 5.0之前的系统上存在一个系统漏洞:在使用原生弹窗时,如果调用了弹窗的setOnDismissListener()、setOnShowListener()、setOnCancelListener()方法,就有可能引起内存泄漏。内存泄漏会导致卡顿现象,内存泄露次数增多后还会导致内存溢出,从而引起应用程序崩溃,影响用户体验。因此,本实施例中可以通过预先封装的弹窗控件,从而在获取到弹窗控件的消失事件时,通过调用反射方法实现释放弹窗控件引用的外部对象,以解决Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题。
本发明实施例的调用弹窗控件的处理方法,通过获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。进而,若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。进一步,判断私有变量值是否为空,若获知私有变量值不为空,则释放弹窗控件引用的外部对象。由此,通过反射方法获取弹窗控件引用的外部对象的私有变量值,在私有变量值不为空时释放私有变量值,实现了释放弹窗的外部对象,优化了产品的内存使用情况,解决了Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题,进而避免内存泄露造成的程序卡顿以及内存溢出,提升用户体验。并且,通过预先封装的弹窗控件实现调用、监听和释放,通用性可维护性好,降低了开发成本。
基于上述实施例,进一步地,若获知私有变量值为空,还可以调用反射方法赋予私有变量值为空。
图2为本发明实施例所提供的另一种调用弹窗控件的处理方法的流程示意图,如图2所示,该调用弹窗控件的处理方法包括:
步骤201,根据弹窗控件的消失监听事件和引用对象释放事件封装弹窗控件。
其中,消失监听事件可以包括innerListener、mDismissListener。
可选地,可以通过innerListener实现内部监听弹窗的消失事件。进一步地,由于外部也有可能需要监听弹窗的消失事件,因此,可以在基类中创建mDismissListener属性,以实现外部监听弹窗的消失事件。
其中,引用对象释放事件可以包括clearDismissMessage()方法、clearShowMessage()方法、clearCancelMessage()方法。
作为一种示例,在封装的弹窗控件的基类中包括mDismissListener和innerListener两个属性、相关构造方法、以及clearDismissMessage()方法、clearShowMessage()方法、clearCancelMessage()方法。
可以理解,在Android 5.0之前的系统上存在一个系统漏洞:在使用原生弹窗时,如果调用了弹窗的setOnDismissListener()、setOnShowListener()、setOnCancelListener()方法,就有可能引起内存泄漏。内存泄漏会导致卡顿现象,内存泄露次数增多后还会导致内存溢出,从而引起应用程序崩溃,影响用户体验。因此,本实施例中可以通过clearDismissMessage()方法、clearShowMessage()方法、clearCancelMessage()方法等引用对象释放事件封装弹窗控件,从而在获取到弹窗控件的消失事件时,通过调用反射方法实现释放弹窗控件引用的外部对象,以解决Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题。并且,根据消失监听事件和引用对象释放事件预先封装弹窗控件,以通过该弹窗控件实现监听和引用对象释放,相比书写具体弹窗代码主动管理原生弹窗控件的方式,为开发人员提供一个通用、易维护的弹窗控件,提高了开发效率。
步骤202,获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。
在本发明的一个实施例中,在监听弹窗控件的消失事件之前,还可以在类初始化时通过调用父类的方法将内部监听指令传给弹窗控件。作为一种示例,可以在类初始化时通过调用父类的setOnDismissListener()方法将innerListener传给弹窗控件,以便于监听该弹窗的消失事件。
前述实施例中对步骤101的解释说明同样适用于本实施例中的步骤202,此处不再赘述。
步骤203,若获取到弹窗控件的消失事件,则向调用对象发送弹窗控件的消失通知,并调用反射方法获取弹窗控件引用的外部对象的私有变量值。
作为一种示例,当获取到弹窗控件的消失事件时,可以调用mDismissListener向弹窗控件调用的外部对象通知弹窗的消失事件,以实现外部监听弹窗的消失事件。
作为另一种示例,当获取到弹窗控件的消失事件时,可以调用相关clear Message()方法将弹窗引用的外部对象释放。
步骤204,判断私有变量值是否为空,若获知私有变量值为空,则调用反射方法赋予私有变量值为空。
在本发明的一个实施例中,在调用反射方法获取私有变量,并通过get方法获取该私有变量的私有变量值之后,当获取的私有变量值为空时,可能存在私有变量实际不为空的情况。因此,还可以调用反射方法赋予私有变量值为空,从而保证私有变量值被赋值为空,保证弹窗引用的外部对象释放的可靠性,进一步减少了弹窗内存泄露。
在本发明的一些实施例中,在该弹窗控件调用Dismiss方法(例如调用onDismiss())之后,若该弹窗控件再次调用show方法等其他方法就会崩溃。例如,调用Dismiss方法之后,由于弹窗控件的mShowMessage被recycle,内部的target变量为空,因此,再次调用Message.obtain(mShowMessage).sendToTarget();时会报空指针异常。本实施例中,可以获取调用对象发送的调用指令,并根据调用指令判断弹窗控件是否调用Dismiss方法;若是,则将弹窗控件的对象设置为null。例如可以在每次调用onDismiss()时将弹窗控件对象置为null(空),从而保证一个弹窗控件对象只使用一次,避免弹窗崩溃,保证了弹窗控件的稳定性和可靠性。
需要说明的是,本示例中,调用Dismiss方法可以为调用onDismiss(),onDismiss()可以在调用setOnDismissListener()之后。此外,本发明上述实施例中出现的setOnDismissListener()可用于监听,clearDismissMessage()可用于释放对象,mDismissListener为弹窗基类的属性,需与上述Dismiss方法进行区分。
下面结合将弹窗控件引用的外部对象进行释放的流程进行说明。
参照图3,通过相关clear Message()方法将弹窗控件引用的外部对象进行释放的流程如图3所示。
通过调用反射方法获取弹窗的私有变量,并通过get方法获取该私有变量的值。进而,当所述私有变量的值不为空时,调用recycle方法释放该私有变量的值,进一步通过调用反射方法将私有变量赋值为空;当所述私有变量的值为空时,调用反射方法将私有变量赋值为空。由此,实现了将弹窗持有的外部变量进行释放,保证弹窗不会内存泄露,解决了Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题。
为了实现上述实施例,本发明还提出一种调用弹窗控件的处理装置。
图4为本发明实施例所提供的一种调用弹窗控件的处理装置的结构示意图,如图4所示,该调用弹窗控件的处理装置包括:处理模块100,获取模块200,判断模块300,释放模块400。
其中,处理模块100,用于获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。
获取模块200,用于若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。
判断模块300,用于判断私有变量值是否为空。
释放模块400,用于若获知私有变量值不为空,则释放弹窗控件引用的外部对象。
在图4的基础上,图5所示的调用弹窗控件的处理装置还包括:通知模块500,封装模块600。
其中,通知模块500,用于向调用对象发送弹窗控件的消失通知。
封装模块600,用于根据弹窗控件的消失监听事件和引用对象释放事件封装弹窗控件。
进一步地,释放模块400还用于:若获知私有变量值为空,则调用反射方法赋予私有变量值为空。
进一步地,处理模块100还用于:根据调用指令判断弹窗控件是否调用Dismiss方法;若是,则将弹窗控件的对象设置为空。
需要说明的是,前述实施例中对调用弹窗控件的处理方法的解释说明同样适用于本实施例的调用弹窗控件的处理装置,此处不再赘述。
本发明实施例的调用弹窗控件的处理装置,通过获取调用对象发送的对预先封装的弹窗控件的调用指令,并监听弹窗控件的消失事件。进而,若获取到弹窗控件的消失事件,则调用反射方法获取弹窗控件引用的外部对象的私有变量值。进一步,判断私有变量值是否为空,若获知私有变量值不为空,则释放弹窗控件引用的外部对象。由此,实现了释放弹窗的外部对象,解决了Android 5.0之前的系统使用原生弹窗引起的内存泄漏问题,通用性可维护性好,降低了开发成本。
为了实现上述实施例,本发明还提出一种电子设备,包括处理器和存储器;其中,处理器通过读取存储器中存储的可执行程序代码来运行与可执行程序代码对应的程序,以用于实现如前述任一实施例所述的调用弹窗控件的处理方法。
为了实现上述实施例,本发明还提出一种计算机程序产品,当计算机程序产品中的指令被处理器执行时实现如前述任一实施例所述的调用弹窗控件的处理方法。
为了实现上述实施例,本发明还提出一种非临时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如前述任一实施例所述的调用弹窗控件的处理方法。
图6示出了适于用来实现本发明实施例的示例性电子设备的框图。图6显示的电子设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图6所示,电子设备12以通用计算设备的形式表现。电子设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(Industry StandardArchitecture;以下简称:ISA)总线,微通道体系结构(Micro Channel Architecture;以下简称:MAC)总线,增强型ISA总线、视频电子标准协会(Video Electronics StandardsAssociation;以下简称:VESA)局域总线以及外围组件互连(Peripheral ComponentInterconnection;以下简称:PCI)总线。
电子设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被电子设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(Random Access Memory;以下简称:RAM)30和/或高速缓存存储器32。电子设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图6未显示,通常称为“硬盘驱动器”)。尽管图6中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如:光盘只读存储器(Compact Disc Read OnlyMemory;以下简称:CD-ROM)、数字多功能只读光盘(Digital Video Disc Read OnlyMemory;以下简称:DVD-ROM)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本申请各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本申请所描述的实施例中的功能和/或方法。
电子设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,电子设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(Local Area Network;以下简称:LAN),广域网(Wide Area Network;以下简称:WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与电子设备12的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理单元16通过运行存储在系统存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现前述实施例中提及的方法。
在本发明的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。