React Native: отправка событий с Android на JavaScript
Есть доступная документация о том, как связываться с частями javascript RN с нативными частями в android и ios через мост RN. Что-то неясно, это жизненный цикл для мостового общения.
(исходная среда)
У меня есть фоновый сервис в Android и мне нужно отправлять события в мое приложение RN. Вот так я отправляю события с моего андроида Service
:
private RCTDeviceEventEmitter emitter() {
return mReactContext.getJSModule(RCTDeviceEventEmitter.class);
}
private void pushPayload(String event, WritableMap payload) {
emitter().emit(event, payload);
}
public void sendTimerEvent(long remaining) {
WritableMap data = Arguments.createMap();
data.putInt("remaining", (int) remaining);
pushPayload("timeoutEvent", data);
}
На стороне JavaScript я использую следующий статический код (не в компоненте, просто код, импортированный в мой index.android.js
файл:
const subscribeForNativeEvents = (eventID, callback) => {
const Emitter = Platform.OS === 'android' ? DeviceEventEmitter : NativeAppEventEmitter;
Emitter.addListener(eventID, callback);
};
subscribeForNativeEvents('timeoutEvent', (event) => {
// work with event.remaining
});
Мой сервис работает, даже когда приложение находится в фоновом режиме. Но я хочу убедиться, что я пытаюсь общаться со стороной JavaScript только тогда, когда это безопасно.
Я иногда получаю ошибки, такие как React: Calling JS function after bridge has been destroyed
, Есть ли способ узнать на родной (андроидной) стороне, доступен ли мост или нет?
Это не о том, как сохранить фоновый код живым, а о том, чтобы убедиться, что пока мой родной (android) код работает, я могу гарантировать, что события не будут потеряны.
1 ответ
Эта проблема возникает, когда соответствующий ReactContext / CatalystInstance уже был уничтожен, и вы пытаетесь сделать некоторые вещи JS с собственной стороны (например, отправка событий, выполнение обратных вызовов и т. Д.).
Я думаю, что вам лучше всего использовать обратные вызовы жизненного цикла, т.е. onHostResume, onHostDestroy ( https://facebook.github.io/react-native/docs/native-modules-android.html) или использовать еще один обратный вызов на CatalystInstanceDestroy ( https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java#L51)
Отправляйте события только тогда, когда вы знаете, что они не уничтожены.
Основная идея заключается в том, что обычно реагирующий контекст привязан к определенной активности / контексту в вашем приложении, и вы можете узнать этот жизненный цикл с помощью обратных вызовов в NativeModule.
Вы можете найти более подробную информацию, вероятно, на ( https://github.com/facebook/react-native/blob/b531612b2c917e1f2bd6bb37bf854fe51e658b36/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java#L104