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

Другие вопросы по тегам