Урок 92. Service. Простой пример

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 10 июл 2013, 09:40

Что бы понять с ошибкой, надо сбросить стектрейс ошибки. Тут телепатов нет. Стектрейс можно получить в DDMS.

Markevich
Сообщения: 6
Зарегистрирован: 10 июл 2013, 00:26

Re: Урок 92. Service. Простой пример

Сообщение Markevich » 30 июл 2013, 13:03

no-- писал(а):Что бы понять с ошибкой, надо сбросить стектрейс ошибки. Тут телепатов нет. Стектрейс можно получить в DDMS.
Спасибо что подсказали где рыть. В принципе разобрался но немного не уверен в решении. Если можно подскажите.
Суть примерно в следующем, для обращения к интернет ресурсу у меня создан отдельный класс, с своими методами для получения информации. Проблемма возникает тогда когда я создаю объект из класса в активити и вызываю метод в котором прописанно обращение к ресурсу. Если я все правильно понимаю, в этом случае новай класс создается в другом таске без права доступа к интернету. На сколько я понимаю правильно делать вызов класса через интент, но у меня несколько конструкторов для класса которые стартуюп по ситуации. Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.
Вернее конечно верно, обращение к интернет ресурсу должно проходить через асинхронную задачу, но только как то я не совсем доганяю каким образом это осуществляется.
Направте мой глупый лоб на истенный путь.
Может я ошибаюсь, но у меня есть несколько активити, писать в каждом класс для асинхронной задачи не логично. как правильно поступить в этом случае?
Заранее благодарен за любую помощь.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 30 июл 2013, 13:58

Я не совсем понимаю, что вы имеете ввиду под классом. Активити? Обычный класс? Синглтон? Анонимный? Статический? Локальный? Какой?
Могу сказать что обращение к интернет-ресурсу должно происходить ТОЛЬКО в отдельном потоке от UI потока, т.е. ни в какой активности, ни в сервисе (если он только не в отдельном процессе или не IntentService), не должно быть обращение к сетевому ресурсу. Поправка. Напрямую.
А НЕ на прямую, это через AsyncTask. Т.е.
Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.
очень даже правильно.
но только как то я не совсем доганяю каким образом это осуществляется.
Вы не поняли что написали? =)

Markevich
Сообщения: 6
Зарегистрирован: 10 июл 2013, 00:26

Re: Урок 92. Service. Простой пример

Сообщение Markevich » 30 июл 2013, 16:48

no-- писал(а):Я не совсем понимаю, что вы имеете ввиду под классом. Активити? Обычный класс? Синглтон? Анонимный? Статический? Локальный? Какой?
Могу сказать что обращение к интернет-ресурсу должно происходить ТОЛЬКО в отдельном потоке от UI потока, т.е. ни в какой активности, ни в сервисе (если он только не в отдельном процессе или не IntentService), не должно быть обращение к сетевому ресурсу. Поправка. Напрямую.
А НЕ на прямую, это через AsyncTask. Т.е.
Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.
очень даже правильно.
но только как то я не совсем доганяю каким образом это осуществляется.
Вы не поняли что написали? =)
:)Что написал понимаю. Просто немного не привычно в некоторых моментах работа самой платформы.
Что через асинхронную задачу надо делать я понимаю. В настоящий момент у меня в активити прописывается класс согласно одному из уроков. Мне не нравиться, в этом то ,что некоторые активити у меня будут запускаться раз в сто лет, другие часто. Писать в каждой активити этот класс с практически одинаковами асинхроннами классами не логично. Логичнее было бы создать файл в папке src(class). и в нем прописать класс для запуска асинхронных задач, более или менее унифицированный. в моем понимании.
Но проблема, для меня в том, что я не уверен как этот класс потом правильно запускать, что бы не повторилась ошибка, или не было проблем на более ранних андроидах. на просторах гула я мало что нашел, хотя предполагаю плохо искал. Предполагаю что обращаться к классу необходимо через интент.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 30 июл 2013, 18:38

А, вот оно что. Ну у меня тоже сейчас немного криво сделано, есть повторяющийся код таксов. Решение могу предположить в сервисе, в двух видах:
1. Service в отдельном процессе (в манифесте ему прописывается :remote), после чего работа с ним через AIDL. так как он в отдельном процессе, то в принципе всю работу он может вести так, как ему заблагорассудится, ибо это не поток UI. Более того, он может жить в системе и без активностей и хранить ответ. Активность может к примеру заново запуститься и получить старый ответ. Но можно и завершить сервис. По желанию
2. Более простой вариант, это IntentService. Он как бы делает очередь из поступающих задач в отдельном потоке. Более подробно, стоит о нем погуглить, либо тут в уроках найти. То ли 99, то ли 100, не помню.

Markevich
Сообщения: 6
Зарегистрирован: 10 июл 2013, 00:26

Re: Урок 92. Service. Простой пример

Сообщение Markevich » 31 июл 2013, 11:48

Спасибо большое, первый вариант думаю мне больше подходит:) Спасибо:))))))
Тут нет смайлика что по кланяется великим духам:) Низкий поклон за помощь, дальше я думаю разберусь.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 16 окт 2013, 21:53

Фрагмент кода:
[syntax=java]
void someTask() {
new Thread(new Runnable() {[/syntax]
У меня после выделения кода в отдельный поток, сервис убивается а поток продолжает работать.
Т.к. решил где-то посредине убить сервис.

Код: Выделить всё

i=1
i=2
onDestroy
i=3
i=4
i=5
Нужно и поток убивать.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 16 окт 2013, 22:21

[syntax=java]
Thread myThread;
void someTask() {
myThread = new Thread(new Runnable() {
[/syntax]

[syntax=java]
void stopThread() {
if (myThread!=null) try {
myThread.interrupt();
myThread.join(10000);
} catch (InterruptedException e1) {
//Nothing to do
}
}
[/syntax]
В join указано время, которое дается потоку на доделывание своей работы. Если успеет, то молодец, иначе свалится в исключение и убьется системой.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 16 окт 2013, 22:29

На строке: myThread = new Thread(new Runnable() {
ругается
Type mismatch: cannot convert from void to Thread

[syntax=java]
void someTask() {
myThread = new Thread( new Runnable() {
public void run() {
for (int i = 1; i<=5; i++) {
Log.d(LOG_TAG, "i = " + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
stopSelf();
}
}).start();
}
[/syntax]
Где-то ошибка.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 16 окт 2013, 23:21

У меня почти получилось, только Runnable через переменную killMe не убить. Повторяется строка ----тест 2.

[syntax=java]
public class MyService extends Service {

final String LOG_TAG = "myLogs";
Thread myThread;
private boolean killMe = false;

public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "onCreate");
}

public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_TAG, "onStartCommand");
someTask();
return super.onStartCommand(intent, flags, startId);
}

public void onDestroy() {
super.onDestroy();
killMe = true; // убиваем Runnable
stopThread(); // убиваем Thread

Log.d(LOG_TAG, "onDestroy");
}

public IBinder onBind(Intent intent) {
Log.d(LOG_TAG, "onBind");
return null;
}

void someTask() {
Runnable r = new Thread(new Runnable() {
public void run() {
Log.d(LOG_TAG, "----тест 0 ");
if(!killMe)
{
Log.d(LOG_TAG, "----тест 1 ");
for (int i = 1; i <= 5; i++) {
Log.d(LOG_TAG, "----тест 2 ");

Log.d(LOG_TAG, "i = " + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Log.d(LOG_TAG, "----тест 3 ");
stopSelf();
Log.d(LOG_TAG, "----тест 4 ");
}
});
myThread = new Thread(r);
myThread.start();
}

void stopThread() {
if (myThread != null)
try {
myThread.interrupt();
myThread.join(1); // 10000
Log.d(LOG_TAG, "--- stopThread 1");
} catch (InterruptedException e1) {
// Nothing to do
}
}
}
[/syntax]
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 17 окт 2013, 09:27

Что-то мне подсказывает, что проблема в том, что super.onDestroy(); должен стоять в конце метода. А так с виду всё правильно. Если не поможет, то вечером создам проект, гляну.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 17 окт 2013, 10:10

Не помогло.
(т.е. я запускаю сервис и сразу же его торможу, в логе идет повтор строчки из лога "тест2" после onDestroy.)
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 92. Service. Простой пример

Сообщение Mikhail_dev » 17 окт 2013, 11:41

Ну тогда дождись вечера. Кстати метод interrupt ставит флаг с информацией о том, что мы ожидаем завершения работы потока. Его можно считывать через if (myThread.isInterrupted()) { return; }
А вообще мне кажется ошибка в логике запуска. Что значит выводится повтор строчки тест2 после onDestroy? Я по коду могу сказать что она ВСЕГДА должна выводиться кол-во раз, чему равен цикл. Т.е. вообще независимо, останавливаем мы что-то или нет. После отработки цикла, ты останавливаешь сервис в этом же потоке, как он отработает.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 18 окт 2013, 12:18

У меня остался простой вопрос:
Runnable r = new Thread(new Runnable() ...

Этот Runnable как-то убить можно? Или только через if как показано у меня в коде, выше.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 92. Service. Простой пример

Сообщение KamiSempai » 18 окт 2013, 12:42

:shock:
trew писал(а):Runnable r = new Thread(new Runnable() ...
Просто создать Runnable уже не круто?
Runnable r = new Runnable() ...
trew писал(а):Этот Runnable как-то убить можно? Или только через if как показано у меня в коде, выше.
Только через IF.


isInterrupted() не советую использовать, только больше запутаетесь. Там есть ряд нюансов со сбрасыванием этого флага.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 92. Service. Простой пример

Сообщение trew » 18 окт 2013, 12:50

Как показывают, так я и делаю. :) Мало ещё опыта.
isInterrupted() не советую использовать, только больше запутаетесь. Там есть ряд нюансов со сбрасыванием этого флага.
Тогда как нужно? (быстро обучаюсь на готовых примерах :) )
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 92. Service. Простой пример

Сообщение KamiSempai » 18 окт 2013, 13:27

Если хочется больше узнать про Interrupt, вот очень содержательная статья про прерывание потока http://www.ibm.com/developerworks/ru/li ... -jtp05236/
Советую прочитать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

Re: Урок 92. Service. Простой пример

Сообщение G_O_R » 20 ноя 2013, 10:02

Привет всем. Нужна помощь. Нужно написать сервис который можно будет подключить к любой программе и он будет работать сам по себе. Ну так сказать нужен партнер). Сразу скажу не вирус, а наоборот). по примерам написал но не работает. не могу понять почему(((

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 92. Service. Простой пример

Сообщение KamiSempai » 20 ноя 2013, 13:48

Подключить как библиотеку или к другому(не своему) уже установленному приложению?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

Re: Урок 92. Service. Простой пример

Сообщение G_O_R » 20 ноя 2013, 15:40

Моя программа должна делать следующее. Скажем написана уже калькулятор из примера. Нужно создать сервис отдельный файл который можно будет просто вставить в код программы и написать в нем что бы при первом запуске сервис запустился. Как отдельная библиотека чтоб можно было вставить и в другие программы простые. Дальше сервис сам по себе должен жить. Он помещается в автозагрузку, и будет все время запускаться даже если его остановят. Он будет каждые скажем 10 минут собрать данные(gps и тд) и отправить на сервер(вроде есть код отправки, не знаю как на сайте написать получение и обработку, добавление в бд ). в следующей версий будет меню настройки, где можно выбрать время обновление. Программа как бы антикражка, но цель больше не телефон, а человек(целевая аудитория это родители, которые будут знать где ихний ребенок). Должен быть максимум простой и мало весить. У меня есть идея и код, но нет опыта в андроиде. Его я написал больше полу года назад. Не было времени заниматься. Сейчас немного есть) хочется завершить ))) нужна помощь кто может помочь с кодом. Думаю для знающего это займет всего пару дней даже если мой код он удалит и с нуля напишет). Если программа заработает то думаю разместить можно на рынок с символической оплатой от 10р/месяц. И то не программа, а чтоб смотреть на сайте карту). Преимущество от уже сделанных это малая оплата и простота. По сравнению с услугами операторов связи которые дают данные по антеннам и радиус 1 км, то тут от gps и радиус минимален)))

Ответить