2017-12-16 16 views
0

私のスキャナクラスがアプリケーションを拡張し、BeaconConsumerを実装しています。 BeaconManagerをバインドまたはアンバインドしようとすると、NullPointerExceptionが発生します。メソッド内でBeaconManager.bindを実行するとエラーが発生するALTBeacon

public class Scanner extends Application implements BeaconConsumer{ 
private BeaconManager beaconManager; 

@Override 
public void onCreate() { 
    try { 
     super.onCreate(); 

     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(" m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 

} 


public void startScan(long period){ 
    try { 
     if (beaconManager==null) { 
      beaconManager = BeaconManager.getInstanceForApplication(Scanner.this); 
      beaconManager.bind(Scanner.this); 
      beaconManager.setForegroundScanPeriod(period); 
      beaconManager.updateScanPeriods(); 
     } 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void stopScan(){ 
    beaconManager.unbind(Scanner.this); 
} 

私は次のエラーを取得する:

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.bind(org.altbeacon.beacon.BeaconConsumer)' on a null object reference 
+0

これをonCreate()メソッド自体の中で実行しようとするとうまくいきます。 – Timmy

+0

いつ 'startScan'を呼びますか? beaconManagerが初期化される前にやっているかもしれませんか? – donfuxx

+0

MainActivityのonCreate()メソッド内に新しいScannerオブジェクトを作成し、ボタンを使用してstartScanを実行します。 – Timmy

答えて

0

私はこの問題はScannerクラスランニングの複数のインスタンスがあることであると思います。一般的に、Android Applicationクラスのインスタンス(Applicationを拡張するインスタンス)を手動で作成するべきではありません。 AndroidManifest.xmlにそのようなクラスを宣言し、Android OSがアプリケーションを起動するときにそのインスタンスをインスタンス化させるようにします。そのコンストラクタを呼び出して手動でクラスをインスタンス化すると、onCreate()メソッドは呼び出されず、beaconManagerは作成されません。

あなたはActivityから、このクラスのインスタンスを取得したい場合ので、あなたはstartScan()のようなメソッドを呼び出すことができますかstopScan()あなたが使用することができます。

Scanner scanner = (Scanner) this.getApplication();

、また、約2その他の問題に注意してください道のコードが書かれている:

  1. あなたがstartScan()stopScan()startScan()を呼び出した場合、何が第二01に起こりませんbeaconManagerはゼロにならないため、がコールされます。スキャンは再開しません。

  2. その前に、非同期bind(...);呼び出しが完了していない場合beaconManager.updateScanPeriods();への呼び出しは失敗します(通常はそれがありません)コードがcatchブロックに分類させます。簡単に解決できるのは、その電話をbeaconManager.updateScanPeriods();に削除し、のコールをbind(...)の呼び出しの前に移動するだけです。

+0

恐ろしい答えです、ありがとうございます! – Timmy

関連する問題