代码之家  ›  专栏  ›  技术社区  ›  Codeversed dimsuz

如何使用djiskmanager注销应用程序,并使用Mobile SDK Android正确地回拨SDKManagerCallback?

  •  3
  • Codeversed dimsuz  · 技术社区  · 6 年前

    环境

    格拉德尔

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

    应用程序类 安装程序(新建帮助程序)

    public class DJISampleApplication extends Application {
    
        @Override protected void attachBaseContext(Context paramContext) {
            super.attachBaseContext(paramContext);
            Helper.install(this);
        }
    
        ...
    
    }
    

    主要活动 (启动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) {}
    
        })
    );
    

    打电话后 '注册应用程序' 从djiskmanager实例来看,一切都按预期工作。如果退出应用程序、djiskmanager或其他与DJI相关的类,则不要考虑活动/片段生命周期。

    我注意到的第一个(也是更明显的)问题是djiskmanager一直在轮询一个位置。系统栏位置图标永远不会消失,它告诉我DJI SDK安装程序仍在运行。我甚至不知道它为什么要轮询一个位置,但我想这与注册应用程序有关。

    location icon

    在androidstudio中使用Android Profiler工具进行更深入的研究,我可以确认与DJI相关的线程正在持续运行。这一直持续到Android操作系统(我主要在v8.1.0上使用像素XL进行测试)。下面是一个截图 swudp服务 它总是在运行。你也会注意到的 ,大约每分钟发生一次。请记住,这一切都是在应用程序处于后台时发生的。如果你要强制关闭应用程序,所有这些都会消失,包括位置图标。

    DJI SDK in the background showing in Android Profiler


    额外信息

    我试过很多不同的测试,但主要测试的是DJI-sdk4.5.1和4.6。由于新的无人机支持,回到以前的SDK不是一个选择。请注意,在我的测试和这篇文章中,我将我的代码保持在非常小的范围内,这样我就可以精确地确定哪些代码触发了永不停止的后台线程。

    djiskmanager提供了一些感兴趣的方法,但并没有如预期的那样工作。

    DJISDKManager.getInstance().destroy();
    

    一个destroy方法,在我测试的每个场景中都会导致应用程序崩溃。安装程序最初似乎仍然无法从SDK中找到所有的引用,但仍然无法找到它运行的所有类助手.class引发异常并使应用程序崩溃。

    DJISDKManager.getInstance().stopConnectionToProduct();
    

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

    '注销应用程序' 对于SDK来说,没有公开的方式来正确控制这些DJI线程并尊重Android的生命周期。我注意到DJI提供的androidsdk示例的行为与此相同。我测试了4.5.1和4.6分支机构在其位于以下位置的回购: https://github.com/dji-sdk/Mobile-SDK-Android


    我需要什么

    我对DJI-SDK开发还不熟悉,但已经开发Android应用程序很久了。我知道djisdk已经改变了很多关于你如何设置东西,控制不同的管理者,等等。我主要想确认我没有忽略一些东西。如果我真的没有忽视显而易见的问题,有人有办法吗?

    我希望能够正确地将djiskmanager设置为具有生命周期意识的组件。我甚至用实现了LifecycleObserver的manager helper类做了一些测试,但是由于缺少任何方法来停止DJI的服务/线程/等等,所以使用它是毫无意义的。在这个LifecycleObserver类中,我甚至尝试过将回调设置为null onPause并重新创建一个新的回调/注册应用onResume。这不会改变行为。

    感谢阅读:)

    0 回复  |  直到 6 年前
    推荐文章