android callmanager.java,如何使用Mobile-SDK-Android正确注销DJISDKManager和SDKManagerCallback应用程序?...

环境

gradle

implementation 'com.dji:dji-sdk:4.6'

compileOnly 'com.dji:dji-sdk-provided:4.6'

Application class (新助手设置)

public class DJISampleApplication extends Application {

@Override protected void attachBaseContext(Context paramContext) {

super.attachBaseContext(paramContext);

Helper.install(this);

}

...

}

MainActivity (开始SDK注册)

AsyncTask.execute(() -> DJISDKManager.getInstance()

.registerApp(getActivity(), new DJISDKManager.SDKManagerCallback() {

@Override public void onRegister(DJIError djiError) {

if (djiError == DJISDKError.REGISTRATION_SUCCESS) {

DJISDKManager.getInstance().startConnectionToProduct();

}

}

@Override public void onProductDisconnect() {}

@Override public void onProductConnect(BaseProduct baseProduct) {}

@Override public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent, BaseComponent newComponent) {}

})

);

问题

从DJISDKManager实例调用'registerApp'后,一切都按预期工作 . 如果您退出应用程序,DJISDKManager或其他DJI相关课程,请不要尊重活动/片段生命周期 .

我注意到的第一个(也是更明显的)问题是DJISDKManager继续轮询一个位置 . 系统栏位置图标永远不会消失,这告诉我某些东西仍然在DJI SDK设置中运行 . 我甚至不确定为什么它会对一个位置进行轮询,但我认为它与注册应用程序有关 .

使用Android Studio中的Android Profiler工具深入了解一下,我可以确认DJI相关的线程在不断运行 . 这种情况发生在Android OS(我主要使用Pixel XL在v8.1.0上进行测试)之前 . 下面是一个屏幕截图,显示了始终在运行的 SwUdpService (位于dji.midware.sockets.P3中) . 您还会注意到 DjiExecutor ,每隔一分钟左右就会发生一次 . 请记住,当应用程序在后台时,这一切都在发生 . 如果你强制关闭应用程序,所有这一切都会消失,包括位置图标 .

额外信息

我尝试了一系列不同的测试,但主要是测试DJI-SDK 4.5.1和4.6 . 由于新的无人机支持,回到早期的SDK不是一个选项 . 请注意,我在测试和帖子中保留了我的代码非常少,因此我可以准确地确定哪些代码触发了永不停止的后台线程 .

DJISDKManager提供了一些感兴趣的方法,但没有按预期工作 .

DJISDKManager.getInstance().destroy();

一种destroy方法,在我测试的每个场景中都会崩溃应用程序 . 它似乎杀死了所有SDK引用,但是仍然尝试运行的一些代码无法找到最初从Helper.class设置的类会抛出异常并导致应用程序崩溃 .

DJISDKManager.getInstance().stopConnectionToProduct();

stopConnectionToProduct不能满足我的需要 . 我很确定这更多是为了停止接收产品更改的回调,但在我的测试中并没有真正改变任何行为 . 事实上,似乎不再需要startConnectionToProduct . 也许这些都是应该被弃用的旧方法?

众所周知,由于显而易见的原因,DJI SDK非常有限 . 在我看来,SDK没有 'unregisterApp' ,没有公开的方法来正确控制这些DJI线程并尊重Android生命周期 . 我注意到DJI提供的Android SDK示例的行为方式相同 . 我在这里的repo上测试了4.5.1和4.6分支:https://github.com/dji-sdk/Mobile-SDK-Android

如果您测试DJI GO应用程序,它们会正确处理Android生命周期,并且从我所知道的是没有线程在后台持续运行 .

我需要什么

我是DJI SDK开发的新手,但长期以来一直在开发Android应用程序 . 我知道DJI SDK在如何设置,控制不同的经理等方面已经发生了很大的变化 . 我主要想确认一下我并没有忽视什么 . 如果我确实没有忽视显而易见的事实,有没有人有解决方案?

如果我们能够更好地控制我们的应用程序如何初始化DJISDKManager,注册或应用程序以及处理回调/监听器,那将是非常棒的 . 现在它的设置为“冰雹玛丽”寄存器功能,其中有一个回调功能太多 . 事实上DJISDKManager已经是一个静态实例并且没有公共控制方法,似乎无法有效地使用SDK .

我希望能够将DJISDKManager正确设置为生命周期感知组件 . 我甚至用实现LifecycleObserver的经理助手类进行了一些测试,但是没有办法阻止DJI的服务/线程/等,这是毫无意义的 . 在这个LifecycleObserver类中,我甚至尝试将回调设置为null onPause并在onResume上重新创建一个新的回调/注册应用程序 . 这不会改变任何行为 .

谢谢阅读 :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值