Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
#1

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

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

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

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

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

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

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

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

Остановить цикл while
Подскажите пожалуйста, не могу понять как остановить цикл while , создал массив...

использование thread
при нажатии должен срабатывать episodes и появляться новый layout поверх...

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

Остановить выполнение кода
Добрый день уважаемые написал такой код: ...

Как остановить AsyncTask?
Не ругайтесь на код:) с Asynctask работаю только несколько дней class MyTask...

15
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 15:58 #2
Лучший ответ Сообщение было отмечено Tester64 как решение

Решение

t.interrupt();
1
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 16:42  [ТС] #3
Спасибо! Пока работает... Еще не выскакивали "исключения"... Буду тестить!
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
01.09.2015, 16:44 #4
Java
1
2
3
4
5
                    try {
                        Thread.sleep(WAIT_TIMEOUT);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
0
Pablito
2653 / 2135 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
01.09.2015, 17:27 #5
Кто-нибудь вообще проверял, останавливается ли задача после interrupt() ?
Или может все-таки она продолжает работать?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
01.09.2015, 17:36 #6
Паблито, говорят, что работает, но не очень долго
Even after Thread.interrupt() is called, the thread continues to run for a while.
http://www.techrepublic.com/article/interrupting-java-threads/
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 17:50  [ТС] #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...

0
Pablito
2653 / 2135 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
01.09.2015, 18:32 #8
я не навязываю мнение, но имхо, самый правильный способ - это проверять контекст на null, а иначе брейкаться из цикла
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 20:03  [ТС] #9
Цитата Сообщение от Паблито Посмотреть сообщение
это проверять контекст на null, а иначе брейкаться из цикла
А кто может гарантировать что еще не нул, а когда надумаем вставлять - окажется нул? Мой брейк на try это автоматически проверяет...

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

Сейчас засорил поток десятками проверок - маркеры - needBreake, try...cath. Каша вместо кода...
0
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 21:46 #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();
    }
}
0
Pablito
2653 / 2135 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
01.09.2015, 21:53 #11
непонятно чем это поможет в борьбе с NullPointerExeption
0
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 22:10 #12
Цитата Сообщение от Паблито Посмотреть сообщение
я не навязываю мнение, но имхо, самый правильный способ - это проверять контекст на null, а иначе брейкаться из цикла
Вы хотите предложить в потоке использовать переменную из другого потока, которая объявлена без volatile?
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 22:11  [ТС] #13
Цитата Сообщение от Bend3r Посмотреть сообщение
while(!Thread.currentThread().isInterrupted())
Это если вам ЦИКЛ в потоке нужен! С маленькими "вполне безопасными блоками"...
А у меня "линейка"!

Не по теме:

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



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

Не по теме:

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

0
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
01.09.2015, 22:22 #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);
    }
}
1
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2015, 23:29  [ТС] #16
Цитата Сообщение от Bend3r Посмотреть сообщение
Сразу бы описали всю проблему, мне же не ясно что у вас там.
Я описал лишь "частный случай".

Не по теме:


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

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

0
01.09.2015, 23:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2015, 23:29
Привет! Вот еще темы с решениями:

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

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

Как остановить анимацию
Доброго времени суток. Есть две анимации которые работают по очереди,...

Не могу остановить CountDownTimer
Всем доброго времени суток. Пытаюсь написать таймер обратного отсчета до...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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