Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Завершение процесса

#android #процесс


Возможно ли завершить процесс через onBackPressed() ??

не получается так:

    h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            new RequestREFRESH().execute(API_URL);
        }
    };


    System.out.println("Запускаю цикл обновления");
    Thread t = new Thread(new Runnable() {
        public void run() {

            for (int i = 1; i < 86400; i++)//86400-секунд в сутках
            {
                h.sendEmptyMessage(i);
                System.out.println("Запускаю функцию обновления");
                try {
                    System.out.println("Приостанавливаю поток на 5 секунд");
                    Thread.sleep(5000); //Приостанавливает поток на 5 секунд
                } catch (InterruptedException e) {
                    System.out.println("Ошибка задержки среды");
                    e.printStackTrace();
                }
            }

        }
    });
    t.start();

@Override
public void onBackPressed() {


    if (t != null) {
        Thread dummy = t;
        t = null;
        dummy.interrupt();
    }

}


переделал так:

    h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            new RequestREFRESH().execute(API_URL);
        }
    };


    System.out.println("Запускаю цикл обновления");
    t = new Thread(new Runnable() {
        public void run() {

    try {
            for (int i = 1; i < 86400; i++)//86400-секунд в сутках
            {
                if (!t.isInterrupted()) {
                h.sendEmptyMessage(i);
                System.out.println("Запускаю функцию обновления");

                    try {
                       System.out.println("Приостанавливаю поток на 5 секунд");
                       Thread.sleep(5000); //Приостанавливает поток на 5 секунд
                    } catch (InterruptedException e) {
                        System.out.println("Ошибка задержки среды");
                        e.printStackTrace();
                    }

                } else {
                    throw new InterruptedException(); 
                }
            }
        } catch (InterruptedException e) {
            System.out.println("Thread is interrupted"); 
        }

        }
    });
    t.start();

@Override
public void onBackPressed() {


    if (t != null) {
        Thread dummy = t;
        t = null;
        dummy.interrupt();
    }

}


получил ошибку - FATAL EXCEPTION: Thread-83
    


Ответы

Ответ 1



У Вас после interrupt() должен сработать блок catch (правда не сразу, конечно). Добавьте в него break, чтобы выйти из цикла и корректно завершить работу потока. Также корректно было бы добавить в условие цикла !isInterrupted(), помимо условия i < 86400. ОБНОВЛЕНО Переделали Вы странно. Достаточно было в блок catch после вывода e.printStackTrace() вписать команду break, а также изменить условие в цикле на i < 86400 && !isInterrupted(). Еще один try-catch и выброс своего exception бессмысленны.

Комментариев нет:

Отправить комментарий