Ошибка при запуске 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();

Также будьте осторожны с двумя другими проблемами при написании кода:

  1. Если вы позвоните startScan(), stopScan(), startScan(), на втором ничего не случится startScan() позвони, потому что beaconManager не будет ноль. Сканирование не будет перезапущено.

  2. Призыв к beaconManager.updateScanPeriods(); потерпит неудачу, если асинхронный bind(...); вызов до того, как он не завершится (обычно не будет), в результате чего код попадет в блок catch. Простое решение - удалить этот призыв к beaconManager.updateScanPeriods(); и просто переместите beaconManager.setForegroundScanPeriod(period); позвонить до звонка bind(...),

Другие вопросы по тегам