ネイティブモジュールの関数に登録できるコールバックは1つだけですネイティブエラーに反応します

ヴァルングプタ

私は最近、システムからのタイムゾーンと時間変更されたブロードキャストをリッスンし、アプリがいくつかの操作を実行できるようにするAndroidネイティブモジュールを自分に追加しました。ネイティブモジュールは次のようになります

public class TimezoneHandlerModule extends ReactContextBaseJavaModule {
    private final Context context;
    private final TimezoneChangeBroadcastReceiver timezoneChangeBroadcastReceiver;
    private Callback onTimezoneChangeCallback;

    public TimezoneHandlerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.context = reactContext;
        this.timezoneChangeBroadcastReceiver = new TimezoneChangeBroadcastReceiver();
    }

    private void registerForTimezoneChangeHandler() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        getReactApplicationContext().registerReceiver(timezoneChangeBroadcastReceiver, intentFilter);
    }

    private void unregisterTimezoneChangeHandler() {
        getReactApplicationContext().unregisterReceiver(timezoneChangeBroadcastReceiver);
    }

    public void setOnTimezoneChangeCallback(Callback onTimezoneChangeCallback) {
        this.onTimezoneChangeCallback = onTimezoneChangeCallback;
    }

    /**
     * @return the name of this module. This will be the name used to {@code require()} this module
     * from javascript.
     */
    @Override
    public String getName() {
        return "TimezoneHandler";
    }

    @ReactMethod
    public void start(Callback onChange) {
        Log.d(getName(), "Starting the timezone change handler");
        this.registerForTimezoneChangeHandler();
        this.setOnTimezoneChangeCallback(onChange);
    }

    @ReactMethod
    public void stop() {
        Log.d(getName(), "Stopping the timezone change handler");
        this.unregisterTimezoneChangeHandler();
    }

    private class TimezoneChangeBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(getName(), "Received broadcast for timezone/time change " + intent.getAction());
            final String action = intent.getAction();

            if (action.equals(Intent.ACTION_TIME_CHANGED) || action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
                TimezoneHandlerModule.this.onTimezoneChangeCallback.invoke();
            }
        }
    }
}

2つの反応方法が公開されstartていstopます。startタイムゾーン変更または時間変更のブロードキャストが受信されるたびに呼び出されるパラメータとして関数を取ります。ネイティブモジュールを接続してエミュレーターでアプリを起動した後Settings、タイムゾーンを開いて変更すると、関連するログが出力されていることがわかります。

11-24 17:07:21.837 1597-1597/com.xyz D/TimezoneHandler: Received broadcast for timezone/time change
11-24 17:07:21.837 1597-1907/com.xyz I/ReactNativeJS: Detected timezone change

タイムゾーンを再度変更すると、logcatの出力に以下のエラーが表示されます

1-24 17:22:42.356 1597-1597/com.galarmapp D/TimezoneHandler: Received broadcast for timezone/time change
11-24 17:22:42.365 1597-1907/com.galarmapp E/ReactNativeJS: The callback start() exists in module TimezoneHandler, but only one callback may be registered to a function in a native module.
11-24 17:22:42.367 1597-1908/com.galarmapp E/unknown:React: The callback start() exists in module TimezoneHandler, but only one callback may be registered to a function in a native module., stack:
                                                            __invokeCallback@12814:10
                                                            <unknown>@12685:24
                                                            guard@12604:3
                                                            invokeCallbackAndReturnFlushedQueue@12684:6

エラーメッセージから、start関数に別のコールバックをアタッチしようとしているように見えますが、そのようなことは何もしていません。トップレベルコンポーネントstartメソッドを呼び出していますが、componentWillMount2回呼び出されていないことを確認しました。他の人も別のことを試しているときにこのエラーを見たことがありますが、それでも問題の背後にある理由を理解していません。

何か洞察があれば共有してください。

エージェントハント

ドキュメントhttp://facebook.github.io/react-native/docs/native-modules-android.html#callbacksによると-「ネイティブモジュールはコールバックを1回だけ呼び出すことになっています。ただし、保存することはできます。コールバックして後で呼び出します。」コールバックでinvoke()を実行すると、それを再度使用することはできません。

タイムゾーン変更のこの特定のユースケースは、イベントをjavascriptに送信することでより適切に解決されます。このドキュメントを参照してくださいhttp://facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネイティブに反応するnpmモジュール

分類Dev

componentDidUpdateエラー内でネイティブコールsetStateに反応する

分類Dev

不変の違反:ネイティブモジュールをnullにすることはできません

分類Dev

反応ネイティブでリンクするネイティブモジュール(Android)

分類Dev

反応ネイティブからネイティブモジュールに画像を送信する方法は?

分類Dev

ネイティブモジュールから文字列を渡してネイティブに反応する

分類Dev

反応ネイティブには、アプリが使用されていないとき、またはバックグラウンドモードで実行されている関数ライフサイクルがありますか?

分類Dev

モーダルでネイティブスクロールに反応する

分類Dev

ネイティブの突然の反応モジュール `fs`エラーを解決できません

分類Dev

パーセンテージでネイティブに反応するサークルを作成しますか?

分類Dev

Loadashモジュールが見つからない状態でネイティブに反応する

分類Dev

OnPressはコンポーネントのスタイルをループから変更します-フックでネイティブに反応します

分類Dev

反応するネイティブアプリでコールバック関数を繰り返し呼び出すと非常に遅い

分類Dev

カスタムネイティブモジュールは、ネイティブ0.61に反応するようにアップグレードした後、Androidでの動作を停止しました

分類Dev

反応ネイティブアプリは、react-native-admobモジュールを追加した後、起動時にクラッシュします

分類Dev

Firebaseログイン後、componentDidMountメソッド内でネイティブの「this.setStateは関数ではありません」エラーに反応します

分類Dev

水平スクロールビューのスナップはネイティブに反応します

分類Dev

反応ネイティブのモジュールの参照を削除します

分類Dev

反応ネイティブベクトルアイコンを追加中にエラーが発生し、ネイティブWebと反応します

分類Dev

ページでスクロールしない画像はネイティブに反応します

分類Dev

複数のテーブルがネイティブに反応します

分類Dev

react.jsはネイティブ配列トラバーサルに反応し、関数をクリックします

分類Dev

反応ネイティブAndroidで1つのビューを別のビューにオーバーラップする方法

分類Dev

反応ネイティブでの「不明な名前付きモジュール」エラー

分類Dev

MS SQL Compact Editionのモデルを準備するときに、ネイティブの参照とIDキーを同時に使用してオブジェクト/エンティティを関連付けるのはなぜですか?

分類Dev

リストビューアイテムのクリックでネイティブモーダルに反応する

分類Dev

PushNotificationManagerIOSの「ネイティブモジュールをnullにすることはできません」

分類Dev

反応ネイティブで条件付きでモジュールをロードする

分類Dev

デバッグモードでログインせずにネイティブアプリのクラッシュに反応する

Related 関連記事

  1. 1

    ネイティブに反応するnpmモジュール

  2. 2

    componentDidUpdateエラー内でネイティブコールsetStateに反応する

  3. 3

    不変の違反:ネイティブモジュールをnullにすることはできません

  4. 4

    反応ネイティブでリンクするネイティブモジュール(Android)

  5. 5

    反応ネイティブからネイティブモジュールに画像を送信する方法は?

  6. 6

    ネイティブモジュールから文字列を渡してネイティブに反応する

  7. 7

    反応ネイティブには、アプリが使用されていないとき、またはバックグラウンドモードで実行されている関数ライフサイクルがありますか?

  8. 8

    モーダルでネイティブスクロールに反応する

  9. 9

    ネイティブの突然の反応モジュール `fs`エラーを解決できません

  10. 10

    パーセンテージでネイティブに反応するサークルを作成しますか?

  11. 11

    Loadashモジュールが見つからない状態でネイティブに反応する

  12. 12

    OnPressはコンポーネントのスタイルをループから変更します-フックでネイティブに反応します

  13. 13

    反応するネイティブアプリでコールバック関数を繰り返し呼び出すと非常に遅い

  14. 14

    カスタムネイティブモジュールは、ネイティブ0.61に反応するようにアップグレードした後、Androidでの動作を停止しました

  15. 15

    反応ネイティブアプリは、react-native-admobモジュールを追加した後、起動時にクラッシュします

  16. 16

    Firebaseログイン後、componentDidMountメソッド内でネイティブの「this.setStateは関数ではありません」エラーに反応します

  17. 17

    水平スクロールビューのスナップはネイティブに反応します

  18. 18

    反応ネイティブのモジュールの参照を削除します

  19. 19

    反応ネイティブベクトルアイコンを追加中にエラーが発生し、ネイティブWebと反応します

  20. 20

    ページでスクロールしない画像はネイティブに反応します

  21. 21

    複数のテーブルがネイティブに反応します

  22. 22

    react.jsはネイティブ配列トラバーサルに反応し、関数をクリックします

  23. 23

    反応ネイティブAndroidで1つのビューを別のビューにオーバーラップする方法

  24. 24

    反応ネイティブでの「不明な名前付きモジュール」エラー

  25. 25

    MS SQL Compact Editionのモデルを準備するときに、ネイティブの参照とIDキーを同時に使用してオブジェクト/エンティティを関連付けるのはなぜですか?

  26. 26

    リストビューアイテムのクリックでネイティブモーダルに反応する

  27. 27

    PushNotificationManagerIOSの「ネイティブモジュールをnullにすることはできません」

  28. 28

    反応ネイティブで条件付きでモジュールをロードする

  29. 29

    デバッグモードでログインせずにネイティブアプリのクラッシュに反応する

ホットタグ

アーカイブ