摘要:本身是事件驅(qū)動(dòng)的語言,需在中可以使用回調(diào)方法來處理函數(shù)返回的結(jié)果。同樣地在中定義了和的接口,用來處理調(diào)用方法的回調(diào)。是中增加的對(duì)于異步編程和回調(diào)更加友好的使用可以更簡潔,更靈活地處理回調(diào)。
在react-native中可以通過在java層自定義ReactMethod(https://segmentfault.com/a/1190000004486024)方式給JavaScript調(diào)用,這樣在JavaScript層就可以直接調(diào)用Android中的Native方法.
但在大部分的方法調(diào)用中,都需要知道調(diào)用方法之后的處理結(jié)果是什么,有沒有出現(xiàn)異常等情況。JavaScript本身是事件驅(qū)動(dòng)的語言,需在JavaScript中可以使用回調(diào)方法來處理函數(shù)返回的結(jié)果。同樣地在react-native中定義了Callback和Promise的接口,用來處理JavaScript調(diào)用Java方法的回調(diào)。
Callback是react.bridge中的一個(gè)接口,它作為ReactMethod的一個(gè)傳參,用來映射JavaScript的回調(diào)函數(shù)(function)。Callback接口只定義了一個(gè)方法invoke,invoke接受多個(gè)參數(shù),這個(gè)參數(shù)必須是react.bridge中支持的參數(shù)。
首先我們定義一個(gè)類用來給JavaScript調(diào)用:
public class StoreModule extends ReactContextBaseJavaModule { @Override public String getName() { return "StoreModule"; } }
指定其名稱為StoreModule。
下面我們一定個(gè)方法,用來保存userName和password到ShardPreferences中,在這個(gè)方法中,我們需要定義兩個(gè)Callback參數(shù),一個(gè)用來處理成功的情況,一個(gè)用來處理異常的情況。
@ReactMethod public void addUser(String userName, String password, Callback successCallback, Callback errorCallback) { try { if (TextUtils.isEmpty(userName)) { errorCallback.invoke("user name is empty"); return; } if (TextUtils.isEmpty(password)) { errorCallback.invoke("password is empty"); return; } preferences.edit().putString(USER_NAME, userName).commit(); preferences.edit().putString(PASSWORD, password).commit(); successCallback.invoke("add user success"); } catch (Exception e) { e.printStackTrace(); errorCallback.invoke(e.getMessage()); } }
現(xiàn)在我們有了一個(gè)帶有Callback作為參數(shù)的StoreModule類,把這個(gè)類的實(shí)例加入ReactPackage的createNativeModules中,就可以在JavaScript層調(diào)用該方法。
在JavaScript中,調(diào)用這個(gè)帶有Callback參數(shù)的方法:
var {NativeModules}=require("react-native"); var storeModule=NativeModules.StoreModule; storeModule.addUser("jjz","123456",(msg)=>{ alert(msg); },(errorMsg)=>{ alert(errorMsg) });
這里的方法回調(diào)方法我們都是使用的匿名函數(shù),在JavaScript調(diào)用Java之后,處理結(jié)果會(huì)以Callback的形式回到JavaScript中,在JavaScript中再對(duì)相應(yīng)的結(jié)果進(jìn)行處理。
PromisePromise是ES6中增加的對(duì)于異步編程和回調(diào)更加友好的API(https://segmentfault.com/a/1190000004505028),使用Promise可以更簡潔,更靈活地處理回調(diào)。
在react.briage中定義的Promise接口,實(shí)現(xiàn)了resolve和reject的方法,resolve用來處理正確處理結(jié)果的情況,reject用來處理異常的情況。
在StoreModule定義一個(gè)支持Promise作為參數(shù)的方法:
@ReactMethod public void login(String userName, String password, Promise promise) { String storeUserName = preferences.getString(USER_NAME, ""); String storePassword = preferences.getString(PASSWORD, ""); if (!equalsString(userName, storeUserName)) { promise.reject("0", "user name is wrong"); return; } if (!equalsString(password, storePassword)) { promise.reject("1", "password is wrong"); return; } WritableMap map = Arguments.createMap(); map.putDouble("user_id", 1); promise.resolve(map); }
這里的WritableMap繼承了ReadableMap,定義了Java和JavaScript中的參數(shù)轉(zhuǎn)換.
調(diào)用這個(gè)方法的時(shí)候,在JavaScript中會(huì)返回一個(gè)Promise對(duì)象,這意味著你可以JavaScript直接使用。
在JavaScript中調(diào)用:
storeModule.login("jjz","123456").then((map)=>{ alert(map["user_id"]); },(code,message)=>{ alert(message); })
使用Promise比使用Callback更加的簡潔,還能更加靈活的在多線程之間進(jìn)行切換。
代碼地址:https://github.com/jjz/react-native/tree/master/RNJava
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78778.html
摘要:但阿里百川并沒有提供直接獲取數(shù)據(jù)的方法,所以選擇時(shí)一定要慎重。 React-native 使用native第三方sdk ios(以阿里百川用戶反饋為例) 首先安裝cocopods(類似于npm,ios開發(fā)的依賴管理工具,教程:http://www.code4app.com/artic... 在ios根目錄下創(chuàng)建Podfile文件,添加如下代碼(使用的是百川feedback1.1.1版...
摘要:原方式中是經(jīng)過壓縮的腳本文件,預(yù)編譯后則是二進(jìn)制文件。兩者影響疊加導(dǎo)致整體減小,包大小得到優(yōu)化。引擎包引擎包官方文檔中對(duì)內(nèi)存區(qū)的描述您的應(yīng)用用于處理代碼和資源如字節(jié)碼已優(yōu)化或已編譯的碼庫和字體的內(nèi)存。本文首發(fā)自普惠出行產(chǎn)品技術(shù) 自從 Google 的 Flutter 發(fā)布之后,F(xiàn)acebook 對(duì) React-Native 的迭代開始快了起來,優(yōu)化 React-Native 的性能表現(xiàn)...
摘要:傳給回調(diào)函數(shù)的里,包含一個(gè)觸摸事件參數(shù)。官網(wǎng)的版文檔中,和組件中都有屬性,這個(gè)屬性接收一個(gè)回調(diào)函數(shù),函數(shù)原型是,在組件和的組件的時(shí)候觸發(fā)該事件,傳給回調(diào)函數(shù)的里,參數(shù),其中的屬性為該組件的。 1、問題 問題場景: 由于手機(jī)屏幕高度不定,做表單頁面時(shí),外層通常加上ScrollView組件,使其能夠適應(yīng)屏幕進(jìn)行滾動(dòng)。業(yè)務(wù)需要里面放置多個(gè)TextInput組件。 問題描述: 出現(xiàn)的問題是,首...
閱讀 1643·2021-10-27 14:13
閱讀 1883·2021-10-11 10:59
閱讀 3381·2021-09-24 10:26
閱讀 1937·2019-08-30 12:48
閱讀 3046·2019-08-30 12:46
閱讀 2043·2019-08-30 11:16
閱讀 1427·2019-08-30 10:48
閱讀 2749·2019-08-29 16:54