小编Von*_*onD的帖子

为什么调用本地反应原生模块阻止UI?

正如文档中所建议的,我将一些长数据获取代码移动到本机模块中以释放JS线程,但我发现这仍然阻止了UI.为什么这样,我该怎么办才能避免这种情况?

从JS调用本机模块,如下所示:

MyNativeModule.fetch(path).then( data => dispatchData(data) )
Run Code Online (Sandbox Code Playgroud)

原生方法看起来像这样(它使用Android Firebase SDK):

@ReactMethod
public void fetch(final String path, final Promise promise) {
    root.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.exists()) {
                promise.resolve(castSnapshot(snapshot));
            } else {
                promise.resolve(null);
            }
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
            promise.reject(firebaseError.getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

castSnapshot方法将Firebase DataSnapshot对象转换为WriteableMap.如果有用,我可以分享实现.

我观察到的是,即使我替换promise.resolve(castSnapshot(snapshot));castSnapshot(snapshot); promise.resolve(null);,调用也阻止了UI:所以它不是通过桥接器发送数据的罪魁祸首.如果数据量很大,castSnapshot可能需要一些时间,这显然是什么阻塞.

即使这段代码长时间运行,也不应该将它移动到原生模块中释放UI?我怎么没有得到这个?

非常感谢.

react-native

8
推荐指数
1
解决办法
1598
查看次数

如何将HashMap传递给react-native android回调?

当尝试在自定义本机模块a中进行回调时java.util.HashMap,我收到以下错误:java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap.

我不太清楚可以将哪种类型的类型传递给回调.有人建议使用a WritableNativeMap.如果是这样,是否有一种直接的方式来施放HashMap?或者我必须遍历所有键/值对?

如果没有,那么文档就提到了ReadableMap.会更好吗?

非常感谢您的帮助.

这是一些有用的代码.该方法使用Firebase Android SDK:

public void fetch(String path, final Callback callback) {
    root.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.exists()) {
                // snapshot.getValue() is a java.util.HashMap
                callback.invoke(null, snapshot.getValue()); // This triggers the error
            } else {
                callback.invoke(null);
            }
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
            callback.invoke(firebaseError.getMessage());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

android react-native

4
推荐指数
1
解决办法
3163
查看次数

标签 统计

react-native ×2

android ×1