本發(fā)明涉及React Native技術領域,尤其涉及一種在React Native組件之間傳遞native對象的方法和裝置。
背景技術:
React Native是一種允許開發(fā)者使用前端語言搭建原生App的技術,其原理是對原生UI組件進行封裝,達到使用javascript調(diào)配原生UI組件構建界面的目的。搭建的原生App同時具有web App的靈活性,并且具有良好交互體驗的優(yōu)點。
在利用React Native進行實際開發(fā)中,經(jīng)常需要在React Native的組件/API之間通過javascript傳遞數(shù)據(jù),即其中一個React Native的組件/API發(fā)送數(shù)據(jù)至javascript,javascript經(jīng)過業(yè)務處理后將數(shù)據(jù)發(fā)送至另一個React Native組件/API來使用。數(shù)據(jù)的通用類型為整型、浮點型、字符串、數(shù)組、字典等,上述類型的數(shù)據(jù)可以直接在javascript和React Native組件/API之間傳遞。但是,ReactNative框架無法將某些特殊的native對象如image對象、自定義的model等轉(zhuǎn)換成javascript可識別的對象,只能將native對象的內(nèi)存地址當作16進制數(shù)或字符串來處理;另一個問題是在對象交給javascript后,native對象的生命周期如何管理。因此,需要一種在React Native組件之間傳遞native對象的方法和裝置,以解決現(xiàn)有技術中存在的上述技術問題。
技術實現(xiàn)要素:
本發(fā)明提供一種在React Native組件之間傳遞native對象的方法和裝置,通過javascript傳遞任一類型的native對象。
本發(fā)明采用的技術方案是:一種在React Native組件之間傳遞native對象的方法,包括:內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象;第一React Native組件發(fā)送所述裝箱對象至javascript業(yè)務邏輯模塊;第二React Native組件接收所述javascript業(yè)務邏輯模塊轉(zhuǎn)發(fā)的所述裝箱對象;所述內(nèi)存數(shù)據(jù)管理模塊對所述裝箱對象進行拆箱操作后得到所述native對象。
優(yōu)選地,所述內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象之后,所述方法,還包括:保存所述待裝箱的native對象的強引用。
優(yōu)選地,所述保存所述待裝箱的native對象的強引用之后,所述方法,還包括:所述javascript業(yè)務邏輯模塊發(fā)送釋放指令至內(nèi)存數(shù)據(jù)管理組件;所述內(nèi)存數(shù)據(jù)管理組件基于所述釋放指令調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的移除引用接口移除所述待裝箱的native對象的強引用。
優(yōu)選地,所述內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象之前,所述方法,還包括:所述第一React Native組件調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的裝箱方法;相應地,所述內(nèi)存數(shù)據(jù)管理模塊對所述裝箱對象進行拆箱操作后得到所述native對象之前,所述方法,還包括:所述第二React Native組件調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的拆箱方法。
本發(fā)明還提供了一種在React Native組件之間傳遞native對象的裝置,包括:內(nèi)存數(shù)據(jù)管理模塊,用于將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象;第一React Native組件,用于發(fā)送所述裝箱對象至javascript業(yè)務邏輯模塊;第二React Native組件,用于接收所述javascript業(yè)務邏輯模塊轉(zhuǎn)發(fā)的所述裝箱對象;所述內(nèi)存數(shù)據(jù)管理模塊,還用于對所述裝箱對象進行拆箱操作后得到所述native對象。
優(yōu)選地,所述數(shù)據(jù)管理保存模塊,還用于:保存所述待裝箱的native對象的強引用。
優(yōu)選地,所述裝置,還包括,內(nèi)存數(shù)據(jù)管理組件,用于:所述javascript業(yè)務邏輯模塊發(fā)送釋放指令至所述內(nèi)存數(shù)據(jù)管理組件的條件下,所述內(nèi)存數(shù)據(jù)管理組件基于所述釋放指令調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的移除引用接口移除所述待裝箱的native對象的強引用。
優(yōu)選地,所述第一React Native組件,還用于:在所述內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象之前,調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的裝箱方法;相應地,所述第二React Native組件,還用于:在所述內(nèi)存數(shù)據(jù)管理模塊對所述裝箱對象進行拆箱操作后得到所述native對象之前,所述第二React Native組件調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的拆箱方法。
采用上述技術方案,本發(fā)明至少具有下列效果:
采用本發(fā)明的在React Native組件之間傳遞native對象的方法,通過javascript傳遞任一類型的native對象。
附圖說明
圖1為本發(fā)明第一實施例在React Native組件之間傳遞native對象的方法的流程圖;
圖2為本發(fā)明第二實施例在React Native組件之間傳遞native對象的方法的流程圖;
圖3為本發(fā)明第四實施例在React Native組件之間傳遞native對象的裝置中內(nèi)存數(shù)據(jù)管理模塊的方框圖。
具體實施方式
為更進一步闡述本發(fā)明為達成預定目的所采取的技術手段及功效,以下結(jié)合附圖及較佳實施例,對本發(fā)明進行詳細說明如后。
本發(fā)明提供的在React Native組件之間傳遞native對象的方法,可以通過javascript傳遞任一類型的native對象。下面將詳細地描述本發(fā)明的在ReactNative組件之間傳遞native對象的方法及其各個步驟。
其中,React Native為facebook推出的一項使用javascript和react構建原生app的技術。需要說明的是,本發(fā)明所涉及的native對象,均是現(xiàn)有技術中javascript無法使用的native對象。在React Native中,這些native對象由某一個React Native組件或React Native接口產(chǎn)生,經(jīng)由javascript傳遞給另外的ReactNative組件或者React Native接口進行使用,Javascript本身不使用這些ReactNative對象。
第一實施例
如圖1和圖2所示,本實施例公開的在React Native組件之間傳遞native對象的方法,包括:步驟S2:內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件(如圖2中的React Native組件A)的待裝箱的native對象封裝為通用類型的裝箱對象;步驟S4:第一React Native組件發(fā)送裝箱對象至javascript業(yè)務邏輯模塊;步驟S5:第二React Native組件(如圖2中的react native組件B)接收javascript業(yè)務邏輯模塊轉(zhuǎn)發(fā)的裝箱對象;步驟S6:內(nèi)存數(shù)據(jù)管理模塊對裝箱對象進行拆箱操作后得到native對象。
本實施例通過在native端封裝內(nèi)存數(shù)據(jù)管理模塊來實現(xiàn)待裝箱的native對象的封裝和拆箱操作,實現(xiàn)javascript業(yè)務邏輯模塊不能識別的native對象的傳遞。
Javascript業(yè)務邏輯模塊,由前端開發(fā)者使用javascript進行業(yè)務開發(fā)的邏輯,它依賴于React Native組件,使用React Native組件和接口完成界面的搭建和調(diào)用native的功能。Javascript業(yè)務邏輯模塊通過內(nèi)存數(shù)據(jù)管理模塊在封裝的裝箱對象中添加標識位來判斷得到的裝箱對象是裝箱的數(shù)據(jù)還是通用類型的數(shù)據(jù)。
第二實施例
如圖2所示,在第一實施例的基礎上,步驟S2:內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件(如圖2中的React Native組件A)的待裝箱的native對象封裝為通用類型的裝箱對象之后,本實施例的在React Native組件之間傳遞native對象的方法,還包括:步驟S3:保存待裝箱的native對象的強引用。本實施例的目的為,在裝箱時,內(nèi)存數(shù)據(jù)管理模塊保留待裝箱的native對象的強引用,防止native對象被釋放。
進一步地,步驟S3:保存待裝箱的native對象的強引用之后,本實施例的在React Native組件之間傳遞native對象的方法,還包括:步驟S8:javascript業(yè)務邏輯模塊發(fā)送釋放指令至內(nèi)存數(shù)據(jù)管理組件;內(nèi)存數(shù)據(jù)管理組件基于釋放指令調(diào)用內(nèi)存數(shù)據(jù)管理模塊的移除引用接口移除待裝箱的native對象的強引用。本實施例封裝內(nèi)存數(shù)據(jù)管理組件,實現(xiàn)javascript通過該內(nèi)存數(shù)據(jù)管理組件直接操作裝箱后的native對象的強引用,保證native對象的完整生命周期,防止內(nèi)存數(shù)據(jù)管理模塊對native對象一直不釋放。
第三實施例
如圖2所示,在第一實施例和第二實施例的基礎上,步驟S2:內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件(如圖2中的React Native組件A)的待裝箱的native對象封裝為通用類型的裝箱對象之前,本實施例的在React Native組件之間傳遞native對象的方法,還包括:第一React Native組件調(diào)用內(nèi)存數(shù)據(jù)管理模塊的裝箱方法;相應地,步驟S6:內(nèi)存數(shù)據(jù)管理模塊對裝箱對象進行拆箱操作后得到native對象之前,本實施例的在React Native組件之間傳遞native對象的方法,還包括:第二React Native組件(如圖2中的React Native組件B)調(diào)用內(nèi)存數(shù)據(jù)管理模塊的拆箱方法。
本實施例在native端建立內(nèi)存數(shù)據(jù)管理模塊,用于管理需要交由javascript傳遞的native對象,第一React Native組件在需要將native對象傳遞至javascript之前,調(diào)用內(nèi)存數(shù)據(jù)管理模塊的裝箱方法,將該native對象封裝為通用類型的裝箱對象。當?shù)诙eact Native組件接收到該裝箱對象時,調(diào)用內(nèi)存數(shù)據(jù)管理模塊的拆箱方法,獲得原來的待裝箱的native對象。
第四實施例
如圖2所示,本實施例提供了一種在React Native組件之間傳遞native對象的裝置,包括:內(nèi)存數(shù)據(jù)管理模塊,用于將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象;第一React Native組件(如圖2中的ReactNative組件A),用于發(fā)送裝箱對象至javascript業(yè)務邏輯模塊;第二React Native組件(如圖2中的React Native組件B),用于接收javascript業(yè)務邏輯模塊轉(zhuǎn)發(fā)的裝箱對象;內(nèi)存數(shù)據(jù)管理模塊,還用于對裝箱對象進行拆箱操作后得到native對象。
如圖3所示,內(nèi)存數(shù)據(jù)管理模塊為native端提供對native對象進行裝箱和拆箱的native接口,裝箱接口將native的特殊類型的native對象轉(zhuǎn)換為javascript可以接收的通用類型,拆箱接口則執(zhí)行相反的操作,將裝箱后的數(shù)據(jù)還原為待裝箱的native對象。
第五實施例
如圖2所示,在React Native組件之間傳遞native對象的裝置中,內(nèi)存數(shù)據(jù)管理保存模塊,還用于:保存待裝箱的native對象的強引用。
進一步地,本實施例的在React Native組件之間傳遞native對象的裝置,還包括,內(nèi)存數(shù)據(jù)管理組件,用于:javascript業(yè)務邏輯模塊發(fā)送釋放指令至內(nèi)存數(shù)據(jù)管理組件的條件下,內(nèi)存數(shù)據(jù)管理組件基于釋放指令調(diào)用內(nèi)存數(shù)據(jù)管理模塊的移除引用接口(參見圖3的RN接口中的移除引用接口)移除待裝箱的native對象的強引用。
內(nèi)存數(shù)據(jù)管理模塊維護一個數(shù)據(jù)結(jié)構,例如一個堆棧,用于保存執(zhí)行了裝箱操作的native對象的強引用,防止native對象被釋放,并提供解除強引用對象的移除引用接口,該移除引用接口接收待裝箱的native對象或者裝箱后的裝箱對象,在所維護的數(shù)據(jù)結(jié)構中將指定的待裝箱的native對象移除。
React Native內(nèi)存數(shù)據(jù)管理組件是javascript直接操作內(nèi)存數(shù)據(jù)管理模塊的通道。該組件至少提供一個移除待裝箱的native對象的強引用的移除接口,此移除接口對應內(nèi)存數(shù)據(jù)管理模塊的移除引用接口進行封裝,以便javascript在使用native對象完成后,通知內(nèi)存數(shù)據(jù)管理模塊釋放native對象,防止其釋放不掉,保證待裝箱的native對象的完整生命周期。另外可按需在該組件中添加其他接口,以使javascript對內(nèi)存數(shù)據(jù)管理模塊的操作更加靈活。
如圖3所示,在內(nèi)存數(shù)據(jù)管理模塊中,首先封裝數(shù)據(jù)存儲層,再封裝一層數(shù)據(jù)管理層,至少提供添加接口和刪除的接口(可根據(jù)需求自由添加替換和查找等其他接口),為上層提供統(tǒng)一的服務。然后在數(shù)據(jù)管理層基礎上,封裝一個接口層,該接口層包括native接口和React Native接口(如圖中的RN接口),分別封裝native調(diào)用接口和React Native調(diào)用接口。Native接口為React Native組件提供裝箱方法和拆箱方法,React Native接口為javascript提供移除待裝箱的native對象的強引用。
第六實施例
如圖2所示,第一React Native組件(如圖2中的React Native組件A),還用于:在內(nèi)存數(shù)據(jù)管理模塊將第一React Native組件的待裝箱的native對象封裝為通用類型的裝箱對象之前,調(diào)用所述內(nèi)存數(shù)據(jù)管理模塊的裝箱方法;相應地,第二React Native組件(如圖2中的React Native組件B),還用于:在內(nèi)存數(shù)據(jù)管理模塊對裝箱對象進行拆箱操作后得到native對象之前,第二React Native組件調(diào)用內(nèi)存數(shù)據(jù)管理模塊的拆箱方法。
第一React Native組件和第二React Native組件均是定制封裝的React Native組件,這些React Native組件依賴于內(nèi)存數(shù)據(jù)管理模塊,在需要將native端的特殊對象傳遞給javascript時,需要調(diào)用內(nèi)存數(shù)據(jù)管理模塊的裝箱方法,并將裝箱后的裝箱對象傳遞至javascript,在收到裝箱后的裝箱對象時,需要調(diào)用內(nèi)存數(shù)據(jù)管理模塊的拆箱方法獲得原來的待裝箱的native對象。
舉例說明
內(nèi)存數(shù)據(jù)管理模塊的裝箱接口接收一個id(任意)類型的native對象,用于指定待裝箱的native對象,返回一個字典類型數(shù)據(jù),裝箱操作將待裝箱的id類型的native對象轉(zhuǎn)換為一個字典類型的裝箱對象,返回來的字典類型的裝箱對象包括至少一個key:“address”,用于記錄id類型的native對象的內(nèi)存地址。
在內(nèi)存數(shù)據(jù)管理模塊的拆箱接口接收一個字典類型的裝箱對象后,進行拆箱操作后返回原來的id類型的native對象。拆箱操作解析字典類型的裝箱對象,將“address”指向的內(nèi)存地址,轉(zhuǎn)換為id類型的native對象。
在內(nèi)存數(shù)據(jù)管理模塊中,添加一個字典類型的數(shù)據(jù)結(jié)構,稱為裝箱對象生命周期管理字典,在內(nèi)存數(shù)據(jù)管理模塊初始化時初始化該數(shù)據(jù)結(jié)構。在每次執(zhí)行裝箱操作時,使用裝箱對象中的key:“address”對應的值作為key,以裝箱操作的id類型的native對象作為值,向裝箱對象生命周期管理字典中插入一條數(shù)據(jù)。另外,移除引用接口接收一個id類型的native對象后,返回第二React Native組件的值為空。移除引用接口先判斷接收的native對象是否為字典類型,如果是字典類型,則認為是裝箱后的裝箱對象,讀取“address”字段的值,并在裝箱對象生命周期管理字典中移除以此值為key的數(shù)據(jù);如果接收的native對象不是字典類型,則認為是裝箱之前的待裝箱的native對象,將該待裝箱的native對象所指向的對象內(nèi)存地址轉(zhuǎn)為字符串,并在裝箱對象生命周期管理字典中移除以此字符串為key的數(shù)據(jù)。
通過具體實施方式的說明,應當可對本發(fā)明為達成預定目的所采取的技術手段及功效得以更加深入且具體的了解,然而所附圖示僅是提供參考與說明之用,并非用來對本發(fā)明加以限制。