UniJSCallback.invoke偶发性不回调JS层
UniJSCallback.invoke偶发性不回调JS层
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Win10 22H2 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:Win10 22H2
HBuilderX类型:正式
HBuilderX版本号:3.8.12
手机系统:Android
手机系统版本号:Android 12
手机厂商:华为
手机机型:P40
页面类型:vue
vue版本:vue2
打包方式:离线
项目创建方式:HBuilderX
示例代码:
public class AppCameraModule extends UniModule {
private UniJSCallback cameraCallback;
@UniJSMethod
public void openCamera(JSONObject options, UniJSCallback callback) {
if (mUniSDKInstance != null) {
((Activity) mUniSDKInstance.getContext()).startActivityForResult(intent, 0);
}
// 有且仅有此处缓存callback,在一次完整openCamera的调用-回调过程中不会重复调用
cameraCallback = callback;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_TAKE_PHOTO_SUCCESS) {
// 日志上可以确定走了本if分支,并且cameraCallback 不为null
if (cameraCallback != null) {
Log.d(TAG, "cameraCallback = " + cameraCallback);
JSONObject result = new JSONObject();
String urls = data.getStringExtra("urls");
result.put("code", 0);
result.put("urls", JSONArray.parse(urls));
// 调用后JS层小概率未收到回调
cameraCallback.invoke(result);
cameraCallback = null;
}
} else if (resultCode == RESULT_SELECT_PHOTO_SUCCESS) {
// ...无关代码
} else {
// ...无关代码
}
}
}
操作步骤:
- JS层调用UniModule原生方法
- 原生方法内调起原生Activity,UniModule缓存callback
- 原生Activity返回,UniModule中onActivityResult收到返回结果
onActivityResult
中调用callback.invoke()
- 小概率JS层并没有收到回调
预期结果:
正常回调JS层
实际结果:
JS层小概率收不到回调
2 回复
遇到同样的问题
这个偶发性回调失败的问题可能由以下几个原因导致:
- 生命周期问题:当Activity返回时,如果页面已被销毁或处于后台,可能导致回调失效。建议在调用invoke前检查mUniSDKInstance是否有效:
if(cameraCallback != null && mUniSDKInstance != null && !mUniSDKInstance.isDestroy()){
cameraCallback.invoke(result);
}
- 线程问题:onActivityResult在主线程执行,但JS回调需要在JS线程处理。可以尝试切换到UI线程:
mUniSDKInstance.runOnUiThread(() -> {
if(cameraCallback != null){
cameraCallback.invoke(result);
}
});
- 内存回收:长时间未释放的callback可能被回收。建议在页面销毁时清理callback:
@Override
public void onDestroy() {
super.onDestroy();
cameraCallback = null;
}
- 参数序列化问题:检查urls参数是否包含特殊字符导致JSON解析失败,建议添加try-catch:
try {
cameraCallback.invoke(result);
} catch(Exception e) {
Log.e(TAG, "invoke error", e);
}