React Native Android Bridge 错误:必须在主线程上调用

Jam*_*mes 5 java android android-runonuithread react-native

我正在使用 Sumup SDK 创建通往 React Native 的桥梁。大部分艰苦的工作已经完成,但我试图在处理交易之前调用特定的函数来唤醒读卡器。

我原来的代码是这样的:

@ReactMethod
    public void prepareCardTerminal() {
        SumUpAPI.prepareForCheckout();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后 RN 桥接器调用此函数,如下所示:

static prepareCardTerminal() {
    NativeRNSumup.prepareCardTerminal();
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个 React Native 错误:

Must be called on main thread
Run Code Online (Sandbox Code Playgroud)

我读到这可能意味着它需要在 UI 线程上运行,所以我将函数重写为:

@ReactMethod
public void prepareCardTerminal() {
    new Thread(new Runnable() {
        public void run() {
    SumUpAPI.prepareForCheckout();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

然而,这并没有达到预期的结果(即使它没有显示任何错误)。

任何提示将不胜感激。

编辑:我找到了这个问题的解决方案。我使用 UiThreadUtil:

import com.facebook.react.bridge.UiThreadUtil;
...
    @ReactMethod
public void prepareCardTerminal() {
    UiThreadUtil.runOnUiThread(new Runnable() {
        @Override
        public void run() {
    SumUpAPI.prepareForCheckout();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Waq*_*Haq 6

你可以这样做:

@ReactMethod
public void prepareCardTerminal() {

    // Get a handler that can be used to post to the main thread
    Handler mainHandler = new Handler(context.getMainLooper());

    Runnable myRunnable = new Runnable() {
        @Override 
        public void run() {
            SumUpAPI.prepareForCheckout();
        }
    };

    mainHandler.post(myRunnable);

}


Run Code Online (Sandbox Code Playgroud)

或者更简单:

new Handler(Looper.getMainLooper()).post(new Runnable() {
       @Override
       public void run() {
           SumUpAPI.prepareForCheckout();
       }
});
Run Code Online (Sandbox Code Playgroud)