java - 如何使用 Mobile-SDK-Android 正确注销 DJISDKManager 和 SDKManagerCallback 的应用程序?
问题描述
环境
毕业典礼
implementation 'com.dji:dji-sdk:4.6'
compileOnly 'com.dji:dji-sdk-provided:4.6'
应用程序类 (新的 Helper 设置)
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 相关类,请不要遵守 Activity/Fragment 生命周期。
我注意到的第一个(也是更明显的)问题是 DJISDKManager 不断轮询一个位置。系统栏位置图标永远不会消失,这告诉我 DJI SDK 设置仍在运行某些东西。我什至不确定它为什么要轮询一个位置,但我认为它与注册应用程序有关。
使用 Android Studio 中的 Android Profiler 工具更深入地观察,我可以确认 DJI 相关线程正在持续运行。这种情况一直发生到 Android 操作系统(我主要使用 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 示例的行为方式相同。我在位于此处的仓库中测试了 4.5.1 和 4.6 分支:https ://github.com/dji-sdk/Mobile-SDK-Android
如果您测试 DJI GO 应用程序,它们会正确处理 Android 生命周期,并且据我所知,后台没有持续运行的线程。
我需要的
我对 DJI SDK 开发很陌生,但我已经开发 Android 应用程序很长时间了。我知道 DJI SDK 在设置、控制不同管理器等方面发生了很大变化。我主要想确认我没有忽略某些东西。如果我确实没有忽略显而易见的事情,那么有人有解决方案吗?
如果我们能够更好地控制我们的应用程序如何初始化 DJISDKManager、注册或应用程序以及处理回调/侦听器,那就太棒了。现在它设置了一个“hail mary”注册函数,该函数有一个回调函数太多了。DJISDKManager 已经是一个静态实例,没有公共的控制方法,似乎无法高效地使用 SDK。
我希望能够将 DJISDKManager 正确设置为生命周期感知组件。我什至用实现 LifecycleObserver 的管理器助手类进行了一些测试,但缺乏任何方法来停止 DJI 的服务/线程/等,使用它毫无意义。在这个 LifecycleObserver 类中,我什至尝试将回调设置为 null onPause 并重新创建一个新的回调/注册应用程序 onResume。这不会改变任何行为。
谢谢阅读 :)
解决方案
推荐阅读
- python - 如何使用正则表达式定位日期时间模板?
- python - Python selenium 点击 cookie 弹出窗口
- javascript - 使用类成员而不是状态
- r - 如何在 R 中将属于同一类型(颜色)的节点组合在一起?
- c - thread_create 中的 for 循环终止,不打印任何内容
- go - 将映射列表重写为 go-template 中的字符串列表
- python-3.x - 如何通过 python 完全访问 heroku-postgresql 数据库
- javascript - JavaScript try/catch 块
- docker - Jenkins 侧边栏容器中没有凭据插件,无法更新
- c# - 从 Rider/ReSharper 中的 .net 核心解决方案中的所有程序集中检索类型