封装基础
需要注意的点是:
1、组件的名称
@Override
public String getName() {
return "ToastCustomAndroid";
}
后面在js中使用到的
import {NativeModules} from 'react-native';
module.exports = NativeModules.ToastCustomAndroid;
需要和上面name一致。
2、经过更改了android原生代码就不能再直接reload
jsBundle组件了,需要重新编译android的原生相关的代码。
异步处理
- 回调方法
@ReactMethod
public void callBackFunction(boolean flag, Callback successCallback, Callback errorCallback) {
if (flag) {
successCallback.invoke(1, 2, 3, 4, 5);
} else {
errorCallback.invoke(6, 7, 8, 9, 10);
}
}
当你希望以回调函数的形式来处理异步的时候,你需要使用Callback
这个类的对象。
然后,在JS代码中这样处理:
ToastCustomAndroid.callBackFunction(
true,
(a,b,c,d,e)=>{
ToastCustomAndroid.show('pressed+++true'+rowID+";"+a+","+b+","+c+","+d+","+e,1);
},
(a,b,c,d,e)=>{
ToastCustomAndroid.show('pressed++++false'+rowID+";"+a+","+b+","+c+","+d+","+e,1);
}
)
需要注意的是:你必须给定同样数量的参数进行回调使用。
- Promise对象
ES6中提供了Promise
进行处理异步的回调
@ReactMethod
public void promiseCallbackTest(boolean flag, Promise promise) {
if (flag) {
promise.resolve(100);
} else {
promise.reject("promise Error", "wrong");
}
}
当使用@ReactMethod
进行注解的方法供给RN模块使用的时候,我们传递给promiseCallbackTest
的参数不需要最后的promise参数
ToastCustomAndroid.promiseCallbackTest(false).then(
(value)=>{
ToastCustomAndroid.show("promise返回值为"+value,1);
},
(message)=>{
ToastCustomAndroid.show("rejected"+message,1);
}
)
在
rejected
的回调中,Java方法中传递了两个参数:
/**
* Report an error which wasn't caused by an exception.
*/
void reject(String code, String message);
但是在JS的rejected
的then
回调中,只能回调出message
。
从RN进行原生的Activity的跳转
其实知道了如何使用生产一个RN的module进行了:
@ReactMethod
public void navigateToHybirdTestActivity(int data) {
Intent intent = new Intent(getCurrentActivity(), HybirdTestActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("TEST_INTENT_DATA", data);
getCurrentActivity().startActivity(intent);
}
这里有个地方:
- 你可以使用
getReactApplicationContext()
获取一个ContextWrapper
对象进行startActivity
,也可以获取getCurrentActivity()
获取一个Activity
对象进行startActivity
。
但是,如果使用getReactApplicationContext()
调用startActivity
则会提示:
当然,这样不具备通用性,可以使用反射:
@ReactMethod
public void startActivityFromJS(String name, String params){
try{
Activity currentActivity = getCurrentActivity();
if(null!=currentActivity){
Class toActivity = Class.forName(name);
Intent intent = new Intent(currentActivity,toActivity);
intent.putExtra("params", params);
currentActivity.startActivity(intent);
}
}catch(Exception e){
throw new JSApplicationIllegalArgumentException(
"不能打开Activity : "+e.getMessage());
}
}