【问题标题】:the methods are called in reverse方法被反向调用
【发布时间】:2015-08-25 09:08:10
【问题描述】:

在下面的代码中,当调用btnDiscoverListener 时,会执行“else”语句并调用“btAdapter.startDiscovery();”然后调用“getBTDeviceExtras();”。 在“btAdapter.startDiscovery()”中,它使广播接收器收到有关开始发现相邻设备的通知, 如果发现邻居设备,广播接收器将进入“BluetoothDevice.ACTION_FOUND”。

我预计当“btnDiscoverListener”被调用时,“getBTDeviceExtras()”直到“btAdapter.startDiscovery();”才会被执行彻底结束!! 但正如您在下面发布的输出中看到的那样,首先调用了“getBTDeviceExtras()”。

谁能解释这是如何以及为什么会发生的。

代码:

private OnClickListener btnDiscoverListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (btAdapter.isDiscovering()) {
            return;
        } else {
            btAdapter.startDiscovery();
            getBTDeviceExtras();
        }
    }
};

private void getBTDeviceExtras() {
    Log.d(TAG, LogAnd.show("getBTDeviceExtras", "called."));

    if (this.stateExtDevice != null) {
        Log.d(TAG, LogAnd.show("getBTDeviceExtras", "called1."));
        adapter.add(this.stateExtDevice.getName()+"\n"+this.stateExtDevice.getAddress()+"\n"+this.stateExtDevice.getBondState()
                +"\n"+this.stateExtDevice.getType()+"\n"+this.stateExtDevice.getUuids());
        adapter.notifyDataSetChanged();
    } else {
        Log.d(TAG, LogAnd.show("getBTDeviceExtras", "called2."));
        tvStatus.setText("BT-Receiver received not notifications");
    }
}

代码:

08-25 10:54:14.305: D/MainActivity(2624): -> getBTDeviceExtras:called.
08-25 10:54:14.315: D/MainActivity(2624): -> getBTDeviceExtras:called2.
08-25 10:54:14.325: D/MainActivity(2624): -> onReceive:BluetoothAdapter.ACTION_DISCOVERY_STARTED
08-25 10:54:15.155: D/MainActivity(2624): -> onReceive:BluetoothDevice.ACTION_FOUND
08-25 10:54:27.155: D/MainActivity(2624): -> onReceive:BluetoothAdapter.ACTION_DISCOVERY_FINISHED

【问题讨论】:

  • startDiscovery()是异步的,这意味着它只会调用startDiscovery(),然后它会在后台运行。你需要等待它以某种方式完成。
  • @Detilium 你能告诉我你怎么知道 startdiscovery 是异步的??
  • Fomr this SO 线程(答案 1)编辑:Android Developer

标签: android android-intent broadcastreceiver intentfilter


【解决方案1】:

根据 android 文档: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html

public boolean startDiscovery()

在 API 级别 5 中添加 启动远程设备发现过程。

发现过程通常涉及大约 12 秒的查询扫描,然后对每个新设备进行页面扫描以检索其蓝牙名称。

这是一个异步调用,它会立即返回。注册 ACTION_DISCOVERY_STARTED 和 ACTION_DISCOVERY_FINISHED 意图以确定发现何时开始和完成。注册 ACTION_FOUND 以在发现远程蓝牙设备时收到通知。

设备发现是一个重量级的过程。在发现过程中,不应尝试与远程蓝牙设备建立新连接,现有连接将遇到带宽有限和高延迟的问题。使用 cancelDiscovery() 取消正在进行的发现。 Discovery 不由 Activity 管理,而是作为系统服务运行,因此应用程序应始终调用 cancelDiscovery(),即使它没有直接请求发现,只是为了确定。

发现完成后调用您的 getBTDeviceExtras() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2020-07-24
    • 2016-07-14
    • 2014-03-04
    • 1970-01-01
    • 2012-05-15
    • 2011-12-13
    • 2020-02-25
    相关资源
    最近更新 更多