【问题标题】:React Native Android Bridge Error: Must be called on main threadReact Native Android Bridge 错误:必须在主线程上调用
【发布时间】:2020-03-03 11:29:15
【问题描述】:

我正在使用 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();
        }
    });
}

【问题讨论】:

    标签: java android react-native react-native-android android-runonuithread


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

    • 为我工作。干杯
    【解决方案2】:

    作为问题编辑发布的答案是正确的。 @waquar-ulhaq 的答案在技术上是正确的,但使用 UiThreadUtil 更简单,并且在内部确实使用了 Handler

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      相关资源
      最近更新 更多