Фоновая ветка в ScanCallback

Я пишу приложение, содержащее службу, которая обрабатывает обнаружение устройств Bluetooth. Мои обнаруженные устройства принимаются методом ScanCallback. Я хочу убедиться, что все, что происходит внутри ScanCallback, обрабатывается в фоновом потоке, а не в основном потоке. Моя проблема в том, что в моей реализации каждый обратный вызов создает отдельный поток. Мне было интересно, нормально это или нет, а если нет, то как я могу повторно использовать один и тот же поток для обработки всех обратных вызовов. Вот мой код.

 @TargetApi(21)
    private ScanCallback GetMScanCallbackForApi21AndAbove() {
        return new ScanCallback() {
            @Override
            public void onScanResult(int callbackType,final ScanResult result) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        sendBtDevice(result.getDevice());
                    }
                }).start();
            }


            @Override
            public void onScanFailed(final int errorCode) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //Do something else
                    }
                }).start();
        };
    }

person Saik    schedule 02.12.2017    source источник


Ответы (1)


Что вы можете сделать, так это использовать ExecutorService

И у вас могут быть разные типы сервисов, один поток/пул или что-то еще, что соответствует вашим потребностям.

person elmorabea    schedule 02.12.2017
comment
Спасибо, Махмуд, идеальное решение моей проблемы. Я понятия не имел, что это существует. Вот что я сделал. Создал переменную класса private ExecutorService executeBtDeviceSending = Executors.newSingleThreadExecutor(); а затем использовал executeBtDeviceSending.execute(new Runnable() {public void run(){ CustomLogger.log(Thread INSIDE 1 STATUS: + Thread.currentThread().getName(), 'e'); sendBtDevice(result.getDevice() ); } }); Работает как положено. - person Saik; 03.12.2017
comment
Рад, что смог помочь дружище - person elmorabea; 03.12.2017
comment
Еще один вопрос: когда я использую предложенный вами метод и пытаюсь проверить, в каком потоке выполняется мой код, я заметил, что каждый раз, когда я уничтожаю свой сервис (и вызываю executor.shutDownNow() в onDestroy), имя потока указывает, что мы используем новый бассейн. Например, если имя потока было pool-1-thread-1, оно становится pool-2-thread-1 и так далее. Это безопасно? Кроме того, кажется ли это правильным способом выключения исполнителя? - person Saik; 03.12.2017
comment
Это нормально, если вы посмотрите на исходный код, номер пула статичен, он будет сброшен только в том случае, если ваш процесс будет убит. Проверьте здесь - person elmorabea; 03.12.2017