Ошибка при запуске BeaconManager.bind внутри метода ALTBeacon
Мой класс сканера расширяет приложение и реализует BeaconConsumer. Когда я пытаюсь привязать или отсоединить BeaconManager, я получаю исключение NullPointerException.
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
1 ответ
Я подозреваю, что проблема в том, что есть несколько случаев Scanner
класс бега. В общем случае вам никогда не следует вручную создавать экземпляр класса приложения Android (который расширяет приложение). Вы объявляете такой класс в AndroidManifest.xml и позволяете ОС Android создавать его при запуске приложения. Если вы создаете экземпляр класса вручную, вызывая его конструктор, onCreate()
метод не будет вызван и beaconManager
не будет создан.
Если вы хотите получить экземпляр этого класса из Activity
так что вы можете вызывать методы, такие как startScan()
или же stopScan()
ты можешь использовать:
Scanner scanner = (Scanner) this.getApplication();
Также будьте осторожны с двумя другими проблемами при написании кода:
Если вы позвоните
startScan()
,stopScan()
,startScan()
, на втором ничего не случитсяstartScan()
позвони, потому чтоbeaconManager
не будет ноль. Сканирование не будет перезапущено.Призыв к
beaconManager.updateScanPeriods();
потерпит неудачу, если асинхронныйbind(...);
вызов до того, как он не завершится (обычно не будет), в результате чего код попадет в блок catch. Простое решение - удалить этот призыв кbeaconManager.updateScanPeriods();
и просто переместитеbeaconManager.setForegroundScanPeriod(period);
позвонить до звонкаbind(...)
,