react-native:调用Native方法(Android)
有的时候我们使用React Native无法满足一些使用特定场景,这个时候就需要使用原生的Android方法,比如一些耗时的写操作,操作数据库或者多线程操作等。 我们通过JavaScript调用Toast的例子来看下,JavaScript如何调用Java代码的。 新建一个项目:
在android的项目目录下面新建一个类RNToastModule,此类需要继承 ReactContextBaseJavaModule
首先要Override @Override public String getName() { return "RNToastAndroid"; } 这个方法的返回值就是JavaScript中调用的名称,比如我们命名为RNToastAndroid,在JavaScript中可以这样调用: var {NativeModules}=require('react-native'); var rnToastAndroid = NativeModules.RNToastAndroid; 然后我们可以选择性的覆盖 private static final String DURAION_SHORT_KEY = "SHORT"; private static final String DURAION_LONG_KEY = "LONG"; 在 @Override public Map<String,Object> getConstants() { final Map<String,Object> constants = new HashMap<>(); constants.put(DURAION_SHORT_KEY,Toast.LENGTH_SHORT); constants.put(DURAION_LONG_KEY,Toast.LENGTH_LONG); return constants; } 我们把Toast的两个常量放在了 rnToastAndroid.show('Hello Toast of native',rnToastAndroid.SHORT); 最后我们定义一个React调用的方法: @ReactMethod public void show(String message,int duration) { Toast.makeText(getReactApplicationContext(),message,duration).show(); } 这个使用了 ReactMethod的对应参数
Boolean -> Bool Integer -> Number Double -> Number Float -> Number String -> String Callback -> function ReadableMap -> Object ReadableArray -> Array 注册ReactPackage新建一个RNJavaReactPackage类,继承ReactPackage。 @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new RNToastModule(reactContext)); return modules; } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return new ArrayList<>(); } RNJavaReactPackage创建了一个NativeModule的List。把RNToastModule的实例都添加进去提供给JavaScript层调用。 添加ReactPackage
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override protected boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(),new RNJavaReactPackage() ); } }; 实现 public class MainApplication extends Application implements ReactApplication { @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } } JavaScript中调用在JavaScript显示Toast: 'use strict'; var {NativeModules}=require('react-native'); var rnToastAndroid = NativeModules.RNToastAndroid; rnToastAndroid.show('Hello Toast of native',rnToastAndroid.SHORT); 这样就完成了从JavaScript中直接调用了Java中定义的方法。 代码地址:https://github.com/jjz/react-... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |