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 回复

遇到同样的问题


这个偶发性回调失败的问题可能由以下几个原因导致:

  1. 生命周期问题:当Activity返回时,如果页面已被销毁或处于后台,可能导致回调失效。建议在调用invoke前检查mUniSDKInstance是否有效:
if(cameraCallback != null && mUniSDKInstance != null && !mUniSDKInstance.isDestroy()){
    cameraCallback.invoke(result);
}
  1. 线程问题:onActivityResult在主线程执行,但JS回调需要在JS线程处理。可以尝试切换到UI线程:
mUniSDKInstance.runOnUiThread(() -> {
    if(cameraCallback != null){
        cameraCallback.invoke(result);
    }
});
  1. 内存回收:长时间未释放的callback可能被回收。建议在页面销毁时清理callback:
@Override
public void onDestroy() {
    super.onDestroy();
    cameraCallback = null;
}
  1. 参数序列化问题:检查urls参数是否包含特殊字符导致JSON解析失败,建议添加try-catch:
try {
    cameraCallback.invoke(result);
} catch(Exception e) {
    Log.e(TAG, "invoke error", e);
}
回到顶部