2016-05-12 4 views
0

を動作しません。これは私がオブザーバーを追加することができますし、私のシングルトンクラスであります:バインドサービスは、2番目のバインド後

public void addSensor(AbstractBeaconSensor sensor){ 
    lock.lock(); 

    if(sensors.isEmpty() && !isBinded) { 
     beaconManager.bind(this); 
     Log.d(TAG, "Binding+++++++++++++++++++"); 
     isBinded = true; 
    } 

    sensors.add(sensor); 
    lock.unlock(); 
} 

public void removeSensor(AbstractBeaconSensor sensor){ 
    lock.lock(); 

    sensors.remove(sensor); 

    if(sensors.isEmpty() && isBinded){ 
     try { 
      beaconManager.stopRangingBeaconsInRegion(myRegion); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
     beaconManager.unbind(this); 
     isBinded = false; 
    } 
    lock.unlock(); 
} 

@Override 
public void onBeaconServiceConnect() { 
    Log.d(TAG, "On beacon connect+++++++++++++++++"); 
    beaconManager.setRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 

      Log.d(TAG, "++ " + beacons.size()); 
      long time = System.currentTimeMillis(); 
      try { 
       //lock.lock(); 
       for(AbstractBeaconSensor sensor : sensors) { 
        sensor.setData(beacons, time); 
       } 
      } finally { 
       //lock.unlock(); 
      } 
     } 
    }); 
    try { 
     beaconManager.startRangingBeaconsInRegion(myRegion); 
    } catch (RemoteException e) { 
     Log.d(TAG, "Got exception" + e.getMessage()); 
    } 
} 

1つのAbstractSensorを追加すると、スキャンが正しく機能しているという問題があります。

stopRangingBeaconInRegion()とunbind()を呼び出してからbind()を呼び出した後、サービスはバックグラウンドスキャンモードのままです(30秒ごとにビーコンのリストが表示されます)。

05-12 13:34:39.969 25700-25700/interdroid.swan D/BeaconSingleton: On beacon connect+++++++++++++++++ 
05-12 13:34:42.497 25700-25700/interdroid.swan D/BeaconSingleton: Binding+++++++++++++++++++ 
05-12 13:34:42.502 25700-25700/interdroid.swan D/BeaconSingleton: On beacon connect+++++++++++++++++ 
05-12 13:34:43.728 25700-27614/interdroid.swan D/BeaconSingleton: ++ 5 
05-12 13:34:44.848 25700-27635/interdroid.swan D/BeaconSingleton: ++ 1 
05-12 13:34:46.029 25700-27655/interdroid.swan D/BeaconSingleton: ++ 3 
05-12 13:34:47.161 25700-27672/interdroid.swan D/BeaconSingleton: ++ 7 
05-12 13:34:54.091 25700-27778/interdroid.swan D/BeaconSingleton: ++ 6 
05-12 13:34:55.237 25700-27799/interdroid.swan D/BeaconSingleton: ++ 7 
05-12 13:34:56.423 25700-27817/interdroid.swan D/BeaconSingleton: ++ 4 
05-12 13:34:57.566 25700-27833/interdroid.swan D/BeaconSingleton: ++ 1 
05-12 13:34:58.747 25700-27850/interdroid.swan D/BeaconSingleton: ++ 3 
05-12 13:34:59.894 25700-27873/interdroid.swan D/BeaconSingleton: ++ 5 
05-12 13:35:01.053 25700-27891/interdroid.swan D/BeaconSingleton: ++ 7 
05-12 13:35:02.199 25700-27913/interdroid.swan D/BeaconSingleton: ++ 6 
05-12 13:35:03.354 25700-27930/interdroid.swan D/BeaconSingleton: ++ 3 
05-12 13:35:04.504 25700-27951/interdroid.swan D/BeaconSingleton: ++ 3 
05-12 13:35:05.648 25700-27968/interdroid.swan D/BeaconSingleton: ++ 2 
05-12 13:35:11.405 25700-28056/interdroid.swan D/BeaconSingleton: ++ 8 
05-12 13:35:12.548 25700-28071/interdroid.swan D/BeaconSingleton: ++ 4 
05-12 13:35:13.703 25700-28088/interdroid.swan D/BeaconSingleton: ++ 6 
05-12 13:35:38.580 25700-25700/interdroid.swan D/BeaconSingleton: Binding+++++++++++++++++++ 
05-12 13:35:38.585 25700-25700/interdroid.swan D/BeaconSingleton: On beacon connect+++++++++++++++++ 
05-12 13:35:39.789 25700-28555/interdroid.swan D/BeaconSingleton: ++ 3 
05-12 13:36:24.995 25700-25700/interdroid.swan D/BeaconSingleton: Binding+++++++++++++++++++ 
05-12 13:36:25.022 25700-25700/interdroid.swan D/BeaconSingleton: On beacon connect+++++++++++++++++ 
05-12 13:36:26.224 25700-29401/interdroid.swan D/BeaconSingleton: ++ 6 

logcatで見られるように、2番目のバインドが呼び出されたあと、range notifierの呼び出しは非常にまれです。

誰かが同様の問題に遭遇した場合は、どんな助けもありがとうございます。

+0

他の人が簡単に見ることができるので、あなたの質問にあなたのコードの簡易版を投稿することが良いでしょう。リンクを見ると、bind()がシングルトンの同じインスタンスを繰り返し呼び出されていることがわかります。それはしないでください。オブジェクトインスタンスごとにバインドするコールは1つだけにする必要があります。最初にunbind()を呼び出さずに、同じオブジェクトに対してbind()を再度呼び出すべきではありません。 – davidgyoung

+0

こんにちは、私は自分のサービスから関連するメソッドを投稿しました。あなたが見ることができるように、少なくとも1つのAbstractBeaconSensorがあるときはbindを呼び出し、noneが存在するときはunbind()を呼び出します。バインディングとonBeaconConnectが正しく呼び出されたとしても、Altbeaconは最初の時間ほど高速にスキャンされません... – Veaceslav

答えて

1

シーケンスがアプリケーションのライフサイクルであるかどうかは不明ですが、ライブラリが2番目のbind()呼び出しでバックグラウンドモードであるとライブラリが判断する原因となっています。あなたはonBeaconServiceConnect()に以下の行を追加することでこれを修正することができます

beaconManager.setBackgroundMode(false); 
+0

ありがとうございました。ライブラリがバックグラウンドモードになる理由を理解できません... – Veaceslav

関連する問題