【问题标题】:Android: method (same name) persistent between activities?Android:方法(同名)在活动之间持久化?
【发布时间】:2019-12-17 01:48:30
【问题描述】:

我有一个带有来自库 (emdk ir scan) 的重写方法 (onData) 的活动。 我还有另一项活动,使用相同的方法做其他事情。 如果您在多个活动中使用它,则需要“复制”它,它在他们的文档中。

Error: error Activity has leaked ServiceConnection com.symbol.emdk.EMDKServiceConnection@fd186e9 原来绑定在这里

问题是,当我在活动(新意图和完成)之间切换时,它似乎使用旧的 onData 而不是新活动中的。

示例:我在活动 1 中,用户使用此活动中的 onData 方法(显然),一切正常。然后他切换到活动 2,当它工作时,碰巧使用活动 1 中的 onData 而不是活动 2 中的 onData:-|

不知道我有没有解释过,但是很复杂:-)

@Override
public void onData(ScanDataCollection scanDataCollection) {
    bla bla bla
}


@Override
protected void onPause() {
    super.onPause();
    deInitScanner();
    if (barcodeManager != null) {
        barcodeManager.removeConnectionListener(this);
        barcodeManager = null;
        deviceList = null;
    }
    if (emdkManager != null) {
        emdkManager.release(EMDKManager.FEATURE_TYPE.BARCODE);
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (emdkManager != null) {
        barcodeManager = (BarcodeManager) emdkManager.getInstance(EMDKManager.FEATURE_TYPE.BARCODE);
        if (barcodeManager != null) {
            barcodeManager.addConnectionListener(this);
        }
        enumerateScannerDevices();
        spinnerScannerDevices.setSelection(scannerIndex);
        try {
            initScanner();
        } catch (ScannerException e) {
            e.printStackTrace();
        }
        scanner.triggerType = Scanner.TriggerType.HARD;
    }
}

【问题讨论】:

  • 这个 onData 什么时候调用?
  • 用 IR 扫描后直接

标签: android android-intent android-activity methods overriding


【解决方案1】:

我猜你用 scanner.addDataListener(this) 之类的东西来初始化这个 SDK,this 是活动 1。它本身包含这个活动 1 的引用,所以每次你请求它时,它都会调用 onData活动一。

您可以使用新活动重新初始化它,也可以使用可以从任何地方收听的外部侦听器。

【讨论】:

    【解决方案2】:

    您应该在 onResume 中订阅事件并在 onPause 中取消订阅。如果我了解您使用的是哪个库(EMDK for Android),此代码将是:

    @Override
    protected void onResume(){
        super.onResume();
        BarcodeScanner.getInstance(this);
        BarcodeScanner.registerUIobject(this);
    }
    

    @Override
     public void onPause() {
         super.onPause();
         BarcodeScanner.unregisterUIobject();
     }
    

    所以只有一个活动会监听这个事件

    【讨论】:

    • 您在第二个活动中在哪个活动回调中设置了监听器?
    • 你调试回调调用顺序了吗? (哪些订阅/取消订阅您的活动分叉很好并且不重叠)
    • 当我从第一个活动切换到第二个(无论顺序如何)时,不再调用 onData(错误活动已泄漏 ServiceConnection com.symbol.emdk.EMDKServiceConnection@fd186e9原来是绑定在这里):我需要去一个没有所有与这个问题相关的代码的activity,然后返回我想要的activity。
    • 不知道为什么,但解决了在onPause中切断括号的内容:emdkManager.release(EMDKManager.FEATURE_TYPE.BARCODE);错误日志仍然存在,但它正在工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多