java - React Native Android 桥错误 : Must be called on main thread

标签 java android react-native android-runonuithread

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

我原来的代码是这样的:

@ReactMethod
    public void prepareCardTerminal() {
        SumUpAPI.prepareForCheckout();
    }
}

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

static prepareCardTerminal() {
    NativeRNSumup.prepareCardTerminal();
}

这给我带来了一个 React Native 错误:

Must be called on main thread

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

@ReactMethod
public void prepareCardTerminal() {
    new Thread(new Runnable() {
        public void run() {
    SumUpAPI.prepareForCheckout();
        }
    });
}

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

任何提示将不胜感激。

编辑:我找到了解决此问题的方法。我使用UiThreadUtil:

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

最佳答案

你可以这样做:

@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);

}


或者更简单:

new Handler(Looper.getMainLooper()).post(new Runnable() {
       @Override
       public void run() {
           SumUpAPI.prepareForCheckout();
       }
});

关于java - React Native Android 桥错误 : Must be called on main thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60506273/

相关文章:

java - Android Studio 不兼容的类型

java - 覆盖逻辑:Beginner

java - 继承的 Activity 方法不是从导入的库中调用的

javascript - 如何比较两个数组的值,如果两者相等或不返回差异。按钮

java - 计算大整数 Java 的幂期间的无限循环

java - 如何将 gradle 多项目存储库作为 git 子模块包含在另一个 gradle 项目中

java - 找不到处理 Intent 的 Activity{ act=android.intent.action.CALL dat=电话号码 :1 }?

php - Volley 代码在android中发送空值?

react-native - 如何使用 useState Hook 来处理来自 React Native 中 FlatList 的多个动态文本输入?

reactjs - 操作必须是 redux 中的普通对象