成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

react-native調(diào)用Native:回調(diào)(Android)

Euphoria / 1266人閱讀

摘要:本身是事件驅(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中定義了CallbackPromise的接口,用來處理JavaScript調(diào)用Java方法的回調(diào)。

Callback

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è)方法,用來保存userNamepasswordShardPreferences中,在這個(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í)例加入ReactPackagecreateNativeModules中,就可以在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)行處理。

Promise

Promise是ES6中增加的對(duì)于異步編程和回調(diào)更加友好的API(https://segmentfault.com/a/1190000004505028),使用Promise可以更簡潔,更靈活地處理回調(diào)。
react.briage中定義的Promise接口,實(shí)現(xiàn)了resolvereject的方法,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

相關(guān)文章

  • React-native 使用原生(ios, android)第三方sdk

    摘要:但阿里百川并沒有提供直接獲取數(shù)據(jù)的方法,所以選擇時(shí)一定要慎重。 React-native 使用native第三方sdk ios(以阿里百川用戶反饋為例) 首先安裝cocopods(類似于npm,ios開發(fā)的依賴管理工具,教程:http://www.code4app.com/artic... 在ios根目錄下創(chuàng)建Podfile文件,添加如下代碼(使用的是百川feedback1.1.1版...

    qujian 評(píng)論0 收藏0
  • RN 技術(shù)探索:Hermes Engine 初探

    摘要:原方式中是經(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)...

    Cc_2011 評(píng)論0 收藏0
  • React Native 中切換TextInput保持鍵盤展開

    摘要:傳給回調(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)的問題是,首...

    xiangzhihong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<