Как корректно завершить все действия и закрыть все запущенные потоки в приложении для Android? - PullRequest
0 голосов
/ 28 января 2019

На данный момент в каждом из моих действий у меня есть этот метод:

private void registerReceiverClose(){
    Activity activity = this;
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("CLOSE_ALL");
    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            activity.finish();
        }
    };
    registerReceiver(broadcastReceiver, intentFilter);
}

, а также этот:

@Override
protected void onDestroy() {
    unregisterReceiver(broadcastReceiver);
    super.onDestroy();
}

Они запускаются при следующем выходе из системыКнопка:

    Button logout = findViewById(R.id.logout_button);
    logout.setOnClickListener(click -> {
        Intent intent = new Intent("CLOSE_ALL");
        this.sendBroadcast(intent);
    });

Я уверен, что неправильно закрывается одна вещь: у меня есть этот код:

private static final ScheduledExecutorService pollingScheduledExecutor = Executors.newSingleThreadScheduledExecutor();

private static final Object lock = new Object();
private static ScheduledFuture<?> currentRunningTask;

public void longPoll() {
    synchronized (lock) {
        if (currentRunningTask != null) {
            currentRunningTask.cancel(true);
        }
        try {
            currentRunningTask = pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);
        } catch (Exception ignored) {
        }
    }
}

public void request() {
    Thread requestThread = new Thread(this);
    requestThread.start();
}

, который продолжает выдавать запросы даже после того, как я думаю Я должен выйти из системы, что вызывает ошибки на сервере.

Как я могу сделать так, чтобы все потоки корректно останавливались и приложение закрывалось правильно?

1 Ответ

0 голосов
/ 28 января 2019

Вы можете обернуть код опроса внутри Сервиса .Затем эту службу можно остановить, используя

Intent intent = new Intent(MainActivity.this, MyService.class); 
stopService(intent);  

Внутри службы вы можете переопределить onDestroy() для очистки ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...