Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Остановить Thread - Программирование Android

01.09.2015, 15:28. Просмотров 1032. Ответов 15
Метки нет (Все метки)

Гуру, помогите кодом!

Есть активити, которое заполняется из потока
Поток "линейный":
-долго думаем - выводим в поле 1
-долго думаем - выводим в поле 2
-долго думаем - выводим в поле 3
(полей много - текст, картинки)
Пользователь может в любой момент нажать "выход" и закрыть активити!
Но поток не умирает сам и пытается вывести очередное поле в уже не существующую активити! (естественно с ошибкой)

Как НАГЛО убить поток?

t.stop(); и t.destroy(); вылетают с ошибкой! (java.lang.UnsupportedOperationException)

Не охота вставлять "переключатель" и проверять его состояние перед любым выводом (полей много и их количество еще растет). Как и оборачивать любое изменение активити в try{... Есть ли "универсальное" решение?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2015, 15:28     Остановить Thread
Посмотрите здесь:

Передать данные в работающий thread из другого thread - Программирование Android
Есть 2 потока запущенные разными классами и из потока А нужно сообщить потоку Б что бы он запустил свою определенную функцию. Ссылки на...

Thread.sleep() - Программирование Android
Вообщем, проблемма вот в чем. Я пытаюсь заставить "заснуть" программу, в результате - она засыпает, но сразу выводит все данные. ...

использование thread - Программирование Android
при нажатии должен срабатывать episodes и появляться новый layout поверх имеющегося. @Override protected void onCreate(Bundle...

Остановить задачу в потоке - Программирование Android
Как можно остановить задачу в потоке, если использует ExecutorService ? ExecutorService es = Executors.newFixedThreadPool(2);

Остановить выполнение во фрагменте - Программирование Android
Есть для примера код который расположен в фрагменте. как остановить программу // Если номер введен неверно ...

Как остановить AsyncTask? - Программирование Android
Не ругайтесь на код:) с Asynctask работаю только несколько дней class MyTask extends AsyncTask<Void, Void, Void> { @Override...

Остановить выполнение кода - Программирование Android
Добрый день уважаемые написал такой код: txt=myEdit.getText().toString(); txtlength=txt.length(); if (txtlength==0){ ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 15:58     Остановить Thread #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
t.interrupt();
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 16:42  [ТС]     Остановить Thread #3
Спасибо! Пока работает... Еще не выскакивали "исключения"... Буду тестить!
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
01.09.2015, 16:44     Остановить Thread #4
Java
1
2
3
4
5
                    try {
                        Thread.sleep(WAIT_TIMEOUT);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
01.09.2015, 17:27     Остановить Thread #5
Кто-нибудь вообще проверял, останавливается ли задача после interrupt() ?
Или может все-таки она продолжает работать?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
01.09.2015, 17:36     Остановить Thread #6
Паблито, говорят, что работает, но не очень долго
Even after Thread.interrupt() is called, the thread continues to run for a while.
http://www.techrepublic.com/article/...-java-threads/
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 17:50  [ТС]     Остановить Thread #7
Цитата Сообщение от Паблито Посмотреть сообщение
Кто-нибудь вообще проверял, останавливается ли задача после interrupt() ?
Или может все-таки она продолжает работать?
действительно продолжает!

математика планируется сложная, поэтому решил сначала сделать "каркас" потока!
Примерно так (имена заменены/упрощены):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
поток{
 
try { TimeUnit.MILLISECONDS.sleep(2000); } catch (Exception e) { }
tv1 = (TextView) layout.findViewWithTag("tv_name1");
mHandler.post(new Runnable() { public void run() {
  tv1.setText("111");
}});
Log.i("my", "111");
 
try { TimeUnit.MILLISECONDS.sleep(2000); } catch (Exception e) { }
tv1 = (TextView) layout.findViewWithTag("tv_name2");
mHandler.post(new Runnable() { public void run() {
  tv1.setText("222");
}});
Log.i("my", "222");
 
try { TimeUnit.MILLISECONDS.sleep(2000); } catch (Exception e) { }
tv1 = (TextView) layout.findViewWithTag("tv_name3");
mHandler.post(new Runnable() { public void run() {
  tv1.setText("333");
}});
Log.i("my", "333");
 
}поток
Раньше убивание активити вызывало ошибку на попытке установить текст. Потом попробовал заменить на
Java
1
2
3
try { mHandler.post(new Runnable() { public void run() {
  tv1.setText("777");
}}); } catch (Exception ex) {return;}
Успешно останавливало поток на очередной "ошибке"

После interrupt() попытался снять try - ошибки после убивания активити не выскакивают, но лог продолжает выводить
111
222
333
(и так до последней)

похоже прийдется делать РУЧНОЙ "обрыватель"...

Не по теме:

fuc..n java...

Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
01.09.2015, 18:32     Остановить Thread #8
я не навязываю мнение, но имхо, самый правильный способ - это проверять контекст на null, а иначе брейкаться из цикла
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 20:03  [ТС]     Остановить Thread #9
Цитата Сообщение от Паблито Посмотреть сообщение
это проверять контекст на null, а иначе брейкаться из цикла
А кто может гарантировать что еще не нул, а когда надумаем вставлять - окажется нул? Мой брейк на try это автоматически проверяет...

Опять-же я мечтал просто вызывать что-то вроде делфийского terminate - и знать что поток в ту-же секунду сдыхает! Даже на середине процесса выполнения команды...

Сейчас засорил поток десятками проверок - маркеры - needBreake, try...cath. Каша вместо кода...
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 21:46     Остановить Thread #10
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package javatest;
 
import java.lang.Thread;
 
class MyThread extends Thread {
 
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            System.out.println("I am running");
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                System.out.println("Closing");
                Thread.currentThread().interrupt();
            }
        }
    }
}
 
public class Main {
 
    public static void main(String[] args) throws InterruptedException {
        Thread mythread = new MyThread();
        mythread.start();
        Thread.sleep(2000);
        mythread.interrupt();
    }
}
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
01.09.2015, 21:53     Остановить Thread #11
непонятно чем это поможет в борьбе с NullPointerExeption
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 22:10     Остановить Thread #12
Цитата Сообщение от Паблито Посмотреть сообщение
я не навязываю мнение, но имхо, самый правильный способ - это проверять контекст на null, а иначе брейкаться из цикла
Вы хотите предложить в потоке использовать переменную из другого потока, которая объявлена без volatile?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 22:11  [ТС]     Остановить Thread #13
Цитата Сообщение от Bend3r Посмотреть сообщение
while(!Thread.currentThread().isInterrupted())
Это если вам ЦИКЛ в потоке нужен! С маленькими "вполне безопасными блоками"...
А у меня "линейка"!

Не по теме:

Отображаю активити! Надо БЫСТРО его вывести, а потом "дозаполнить" сложными запросами в базы и прогонкой по формулам. Если все это вставить в OnCreate, то получу открытие окна на 5-15 секунд... Причем много полей "не обязательные". Поэтому в OnCreate запускаю поток на "дозаполнение". И в нем расчитываю и вывожу "долгие поля". В любую секунду юзвер может закрыть активити (ему и первых данных хватило или вообще не туда зашел) и нужно прервать поток, а не продолжать считать "в памяти" еще 15 секунд. И не должно выпадать ошибка при выводе "дорасчитанного" еще одного поля в уже несуществующее окно...



Короче... тему можно закрывать! Увы! Пришлось сильно засорить код... Погуглил на других форумах - похоже и с этим ява накосячила... Надеялся что гугл это исправил - тоже не нашел...
Pablito
01.09.2015, 22:15
  #14

Не по теме:

я вообще делаю не так, но никто все равно слушать не будет, пост выше - подтверждение у ТСа уже сложилось свое мнение

Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 22:22     Остановить Thread #15
Цитата Сообщение от Tester64 Посмотреть сообщение
Это если вам ЦИКЛ в потоке нужен! С маленькими "вполне безопасными блоками"...
А у меня "линейка"!
Сразу бы описали всю проблему, мне же не ясно что у вас там. Вам необходимо при создании Thread, указывать о том что данные поток будет демоном. Потоки-демоны практически не чем не отличаются от простых потоков, только есть одно различие в том что когда main thread завершает свою работу, то и все демон-треды тоже завершают свою работу.

Пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package javatest;
 
import java.lang.Thread;
 
class MyThread extends Thread {
 
    public void run() {
        for (int i = 0; i < 999; i++) {
            System.out.println(i+1);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) { }
        }
    }
}
 
public class Main {
 
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new MyThread();
        myThread.setDaemon(true);
        myThread.start();
        Thread.sleep(2000);
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2015, 23:29     Остановить Thread
Еще ссылки по теме:

Не могу остановить CountDownTimer - Программирование Android
Всем доброго времени суток. Пытаюсь написать таймер обратного отсчета до определенной даты и времени. И все работает хорошо, до момента...

Как остановить анимацию - Программирование Android
Доброго времени суток. Есть две анимации которые работают по очереди, необходимо через определённое количество циклов остановить этот...

Остановить мелодию в MediaPlayer - Программирование Android
Всем привет ,у меня такой вопрос как остановит MediaPlayer? у меня есть класс и в нем один медиаплеер для двух классов import...

Остановить другое приложение - Программирование Android
Как обращаться к работающим приложениям(процессам) в андроиде? Под обращением я понимаю (Выключить/Включить/Спарсить данные и т.д) ...

Обмен информацией с Thread - Программирование Android
Всем привет! Приложение запускает Thread для выполнения некоторой работы. Работа зависит от параметров, которые могут изменяться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 23:29  [ТС]     Остановить Thread #16
Цитата Сообщение от Bend3r Посмотреть сообщение
Сразу бы описали всю проблему, мне же не ясно что у вас там.
Я описал лишь "частный случай".

Не по теме:


Так уж получилось что есть некий "блок" который встраивается через <include layout="@layout/info" /> в активити, диалог И во "флайку" (отдельный "вьюв" над остальными окнами). Если диалог или активити реально "умирают", то флайка лишь скрывается сервисом. Я конечно проверю, но не уверен что поток умрет вместе с флайкой. Поэтому и сделал 2 метода в классе заполнения инклюда/информера - "начать заполнять" и "экстренно прервать заполнение"...

Сейчас я сделал диалог вызываемый из сервиса с инклюдом. На нем и отлаживаю механизм заполнения "блока информера". До флайки еще не добрался - это второй этап...
p.s. Сейчас у меня уже так код засорен проверками и "экстренными прерывателями потока" что вызвать ошибку уже крайне затруднительно...

Yandex
Объявления
01.09.2015, 23:29     Остановить Thread
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru