首页 > 解决方案 > 如何使用 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 在后台显示在 Android Profiler 中


额外信息

我尝试了很多不同的测试,但主要是测试 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。这不会改变任何行为。

谢谢阅读 :)

标签: javaandroiddji-sdk

解决方案


推荐阅读