Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
#1

Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? - Программирование Android

18.06.2015, 11:49. Просмотров 494. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Есть код класса, наследующего Service
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int onStartCommand(Intent intent, int flags, int startId) {
        tTask = new TimerTask() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                sendNotif();
            }
        };
        timer.schedule(tTask, 1000, interval);
        return START_REDELIVER_INTENT;
}
этот класс работает в отдельном потоке. При попытке остановить сервис из другого класса-активити
Java
1
2
3
public void onClickStop(View v) {
        stopService(new Intent(this, MyService.class));
}
сервис еще раз отошлет уведомление через 1-20 секунд.
Вопрос, как сделать так, чтоб из активити можно было сразу остановить сервис без последствий его работы?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2015, 11:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? (Программирование Android):

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

Отрисовка данных в отдельном потоке - Программирование Android
Уважаемые гуру и простые хорошие ребята, подскажите как правильно реализовать отрисовку графики в отдельном потоке? С потоками только...

Создание view элементов в отдельном потоке - Программирование Android
Беру данные из интернета и делаю блоки. Если информации довольно много то при запуске активности(где создаются эти блоки) сначала...

Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код - Программирование Android
Здравствуйте! Пытаюсь загрузить картинку по ссылке из инета в ImageView в отдельном потоке. Поток реализовывал путем перегрузки метода run,...

Выполнение кода в отдельном потоке - C# WPF
Итак есть форма. На ней кнопочка. Под кнопочкой трудоемкий алгоритм. Я хочу чтобы при нажатии на кнопочку запускался алгоритм в не главном...

Выполнение кода в отдельном потоке - Delphi
Есть код программы. Хотел бы полюбоваться красивым видом, но тут столкнулся с проблемой .... Вот код: procedure...

6
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
18.06.2015, 12:09 #2
Ханасака, добрый день!
Подзабыл, кажется, в сервисе есть события, отвечающие за остановку. Внутри можно прописать значение переменной. Соответственно, в таймере надо сделать проверку по этой переменной.
0
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 12:23  [ТС] #3
Цитата Сообщение от CoolMind Посмотреть сообщение
Подзабыл, кажется, в сервисе есть события, отвечающие за остановку. Внутри можно прописать значение переменной. Соответственно, в таймере надо сделать проверку по этой переменной.
Да, думал об этом, но тогда сервис должен каждую секунду проверять, не изменилось ли значение этой переменной, чтоб вызвать метод stopSelf() или stopSelfResult(). Нельзя ли как-то прямо остановить поток или еще чего-то с меньшим подгружанием системы?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
18.06.2015, 13:01 #4
Ханасака, разве нет?
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class YourService extends Service {
 
    // ...
 
@Override
    public void onDestroy() {
        super.onDestroy();
        stopPlaying();
    }
 
private void stopPlaying() {
    // И т.д.
0
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 14:20  [ТС] #5
Цитата Сообщение от CoolMind Посмотреть сообщение
Ханасака, разве нет?
У меня по такой схеме всё и сделано
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class MyService extends Service {
    NotificationManager nm;
    final String LOG_TAG = "myLogs";
    int i = 0;
 
    Timer timer;
    TimerTask tTask;
    long interval = 1000;
 
    @Override
    public void onCreate() {
        super.onCreate();
        timer = new Timer();
    }
    
    @Override
    public void onDestroy() {
        Log.d(LOG_TAG,"onDestroy");
        nm = null;
        timer.cancel();
        super.onDestroy();
    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        tTask = new TimerTask() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                sendNotif();
            }
        };
        timer.schedule(tTask, 1000, interval);
        return START_REDELIVER_INTENT;
    }
 
    void sendNotif() {
        Log.d(LOG_TAG, "running sendNotif!");
        // 1-я часть
        Notification notif = new Notification(R.drawable.ic_launcher,
                "Text in status bar", System.currentTimeMillis());
 
        // 3-я часть
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra(MainActivity.FILE_NAME, "somefile");
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
 
        // 2-я часть
        notif.setLatestEventInfo(this, "Notification's title" + i,
                "Notification's text" + i, pIntent);
 
        // ставим флаг, чтобы уведомление пропало после нажатия
        notif.flags |= Notification.FLAG_AUTO_CANCEL;
        notif.defaults |= Notification.DEFAULT_SOUND;
        // notif.defaults |= Notification.DEFAULT_VIBRATE;
 
        // отправляем
        nm.notify(i, notif);
        nm = null;
        i++;
    }
 
    public IBinder onBind(Intent arg0) {
        return null;
    }
}
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
18.06.2015, 14:26 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ханасака, добавьте в onDestroy установку некоторой переменной в true. А методе sendNotif анализируйте её значение.
1
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 14:38  [ТС] #7
Спасибо, большое!
Решил таким образом: в onDestroy() обнуляю переменную класса interval, а уже затем выполняю timer.cancel(). В sendNotif() первым делом анализирую interval, если он 0, то return. Уведомление не отсылается больше.
1
18.06.2015, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2015, 14:38
Привет! Вот еще темы с ответами:

Как запустит часть кода в отдельном потоке? - C#
Как запустит часть кода в отдельном потоке? Например: как запустить картинку в отдельном потоке? private void Form1_Load(object...

Выполнение в отдельном потоке - Java
Необходимо реализовать выполнение данного класса в отдельном потоке. У меня никак не выходит, прошу помощи) import java.awt.Color; ...

Выполнение операций в отдельном потоке - C++
Например у меня есть функция. void musik() //Создание потоковой функции { Beep(2000,3000); } Как сделать поток,...

Выполнение функции в отдельном потоке - C++ Builder
Вопрос конечно избитый, но толком ничего не нашел. Есть функция с кучей циклов и большими порогами. При её вызове все виснет на время её...


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

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

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