Урок 92. Service. Простой пример
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
Что бы понять с ошибкой, надо сбросить стектрейс ошибки. Тут телепатов нет. Стектрейс можно получить в DDMS.
Re: Урок 92. Service. Простой пример
Спасибо что подсказали где рыть. В принципе разобрался но немного не уверен в решении. Если можно подскажите.no-- писал(а):Что бы понять с ошибкой, надо сбросить стектрейс ошибки. Тут телепатов нет. Стектрейс можно получить в DDMS.
Суть примерно в следующем, для обращения к интернет ресурсу у меня создан отдельный класс, с своими методами для получения информации. Проблемма возникает тогда когда я создаю объект из класса в активити и вызываю метод в котором прописанно обращение к ресурсу. Если я все правильно понимаю, в этом случае новай класс создается в другом таске без права доступа к интернету. На сколько я понимаю правильно делать вызов класса через интент, но у меня несколько конструкторов для класса которые стартуюп по ситуации. Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.
Вернее конечно верно, обращение к интернет ресурсу должно проходить через асинхронную задачу, но только как то я не совсем доганяю каким образом это осуществляется.
Направте мой глупый лоб на истенный путь.
Может я ошибаюсь, но у меня есть несколько активити, писать в каждом класс для асинхронной задачи не логично. как правильно поступить в этом случае?
Заранее благодарен за любую помощь.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
Я не совсем понимаю, что вы имеете ввиду под классом. Активити? Обычный класс? Синглтон? Анонимный? Статический? Локальный? Какой?
Могу сказать что обращение к интернет-ресурсу должно происходить ТОЛЬКО в отдельном потоке от UI потока, т.е. ни в какой активности, ни в сервисе (если он только не в отдельном процессе или не IntentService), не должно быть обращение к сетевому ресурсу. Поправка. Напрямую.
А НЕ на прямую, это через AsyncTask. Т.е.
Могу сказать что обращение к интернет-ресурсу должно происходить ТОЛЬКО в отдельном потоке от UI потока, т.е. ни в какой активности, ни в сервисе (если он только не в отдельном процессе или не IntentService), не должно быть обращение к сетевому ресурсу. Поправка. Напрямую.
А НЕ на прямую, это через AsyncTask. Т.е.
очень даже правильно.Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.
Вы не поняли что написали? =)но только как то я не совсем доганяю каким образом это осуществляется.
Re: Урок 92. Service. Простой пример
Что написал понимаю. Просто немного не привычно в некоторых моментах работа самой платформы.no-- писал(а):Я не совсем понимаю, что вы имеете ввиду под классом. Активити? Обычный класс? Синглтон? Анонимный? Статический? Локальный? Какой?
Могу сказать что обращение к интернет-ресурсу должно происходить ТОЛЬКО в отдельном потоке от UI потока, т.е. ни в какой активности, ни в сервисе (если он только не в отдельном процессе или не IntentService), не должно быть обращение к сетевому ресурсу. Поправка. Напрямую.
А НЕ на прямую, это через AsyncTask. Т.е.очень даже правильно.Сейчас у меня идет обращение через асинхронную задачу, но мне кажется что это не верно.Вы не поняли что написали? =)но только как то я не совсем доганяю каким образом это осуществляется.
Что через асинхронную задачу надо делать я понимаю. В настоящий момент у меня в активити прописывается класс согласно одному из уроков. Мне не нравиться, в этом то ,что некоторые активити у меня будут запускаться раз в сто лет, другие часто. Писать в каждой активити этот класс с практически одинаковами асинхроннами классами не логично. Логичнее было бы создать файл в папке src(class). и в нем прописать класс для запуска асинхронных задач, более или менее унифицированный. в моем понимании.
Но проблема, для меня в том, что я не уверен как этот класс потом правильно запускать, что бы не повторилась ошибка, или не было проблем на более ранних андроидах. на просторах гула я мало что нашел, хотя предполагаю плохо искал. Предполагаю что обращаться к классу необходимо через интент.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
А, вот оно что. Ну у меня тоже сейчас немного криво сделано, есть повторяющийся код таксов. Решение могу предположить в сервисе, в двух видах:
1. Service в отдельном процессе (в манифесте ему прописывается :remote), после чего работа с ним через AIDL. так как он в отдельном процессе, то в принципе всю работу он может вести так, как ему заблагорассудится, ибо это не поток UI. Более того, он может жить в системе и без активностей и хранить ответ. Активность может к примеру заново запуститься и получить старый ответ. Но можно и завершить сервис. По желанию
2. Более простой вариант, это IntentService. Он как бы делает очередь из поступающих задач в отдельном потоке. Более подробно, стоит о нем погуглить, либо тут в уроках найти. То ли 99, то ли 100, не помню.
1. Service в отдельном процессе (в манифесте ему прописывается :remote), после чего работа с ним через AIDL. так как он в отдельном процессе, то в принципе всю работу он может вести так, как ему заблагорассудится, ибо это не поток UI. Более того, он может жить в системе и без активностей и хранить ответ. Активность может к примеру заново запуститься и получить старый ответ. Но можно и завершить сервис. По желанию
2. Более простой вариант, это IntentService. Он как бы делает очередь из поступающих задач в отдельном потоке. Более подробно, стоит о нем погуглить, либо тут в уроках найти. То ли 99, то ли 100, не помню.
Re: Урок 92. Service. Простой пример
Спасибо большое, первый вариант думаю мне больше подходит:) Спасибо:))))))
Тут нет смайлика что по кланяется великим духам:) Низкий поклон за помощь, дальше я думаю разберусь.
Тут нет смайлика что по кланяется великим духам:) Низкий поклон за помощь, дальше я думаю разберусь.
Re: Урок 92. Service. Простой пример
Фрагмент кода:
[syntax=java]
void someTask() {
new Thread(new Runnable() {[/syntax]
У меня после выделения кода в отдельный поток, сервис убивается а поток продолжает работать.
Т.к. решил где-то посредине убить сервис.
Нужно и поток убивать.
[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.
Свои сообщения можно редактировать - кнопка edit.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
[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 указано время, которое дается потоку на доделывание своей работы. Если успеет, то молодец, иначе свалится в исключение и убьется системой.
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 указано время, которое дается потоку на доделывание своей работы. Если успеет, то молодец, иначе свалится в исключение и убьется системой.
Re: Урок 92. Service. Простой пример
На строке: 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]
Где-то ошибка.
ругается
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.
Свои сообщения можно редактировать - кнопка edit.
Re: Урок 92. Service. Простой пример
У меня почти получилось, только 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]
[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.
Свои сообщения можно редактировать - кнопка edit.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
Что-то мне подсказывает, что проблема в том, что super.onDestroy(); должен стоять в конце метода. А так с виду всё правильно. Если не поможет, то вечером создам проект, гляну.
Re: Урок 92. Service. Простой пример
Не помогло.
(т.е. я запускаю сервис и сразу же его торможу, в логе идет повтор строчки из лога "тест2" после onDestroy.)
(т.е. я запускаю сервис и сразу же его торможу, в логе идет повтор строчки из лога "тест2" после onDestroy.)
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 92. Service. Простой пример
Ну тогда дождись вечера. Кстати метод interrupt ставит флаг с информацией о том, что мы ожидаем завершения работы потока. Его можно считывать через if (myThread.isInterrupted()) { return; }
А вообще мне кажется ошибка в логике запуска. Что значит выводится повтор строчки тест2 после onDestroy? Я по коду могу сказать что она ВСЕГДА должна выводиться кол-во раз, чему равен цикл. Т.е. вообще независимо, останавливаем мы что-то или нет. После отработки цикла, ты останавливаешь сервис в этом же потоке, как он отработает.
А вообще мне кажется ошибка в логике запуска. Что значит выводится повтор строчки тест2 после onDestroy? Я по коду могу сказать что она ВСЕГДА должна выводиться кол-во раз, чему равен цикл. Т.е. вообще независимо, останавливаем мы что-то или нет. После отработки цикла, ты останавливаешь сервис в этом же потоке, как он отработает.
Re: Урок 92. Service. Простой пример
У меня остался простой вопрос:
Runnable r = new Thread(new Runnable() ...
Этот Runnable как-то убить можно? Или только через if как показано у меня в коде, выше.
Runnable r = new Thread(new Runnable() ...
Этот Runnable как-то убить можно? Или только через if как показано у меня в коде, выше.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 92. Service. Простой пример
Просто создать Runnable уже не круто?trew писал(а):Runnable r = new Thread(new Runnable() ...
Runnable r = new Runnable() ...
Только через IF.trew писал(а):Этот Runnable как-то убить можно? Или только через if как показано у меня в коде, выше.
isInterrupted() не советую использовать, только больше запутаетесь. Там есть ряд нюансов со сбрасыванием этого флага.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 92. Service. Простой пример
Как показывают, так я и делаю. Мало ещё опыта.
Тогда как нужно? (быстро обучаюсь на готовых примерах )isInterrupted() не советую использовать, только больше запутаетесь. Там есть ряд нюансов со сбрасыванием этого флага.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 92. Service. Простой пример
Если хочется больше узнать про Interrupt, вот очень содержательная статья про прерывание потока http://www.ibm.com/developerworks/ru/li ... -jtp05236/
Советую прочитать.
Советую прочитать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 92. Service. Простой пример
Привет всем. Нужна помощь. Нужно написать сервис который можно будет подключить к любой программе и он будет работать сам по себе. Ну так сказать нужен партнер). Сразу скажу не вирус, а наоборот). по примерам написал но не работает. не могу понять почему(((
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 92. Service. Простой пример
Подключить как библиотеку или к другому(не своему) уже установленному приложению?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 92. Service. Простой пример
Моя программа должна делать следующее. Скажем написана уже калькулятор из примера. Нужно создать сервис отдельный файл который можно будет просто вставить в код программы и написать в нем что бы при первом запуске сервис запустился. Как отдельная библиотека чтоб можно было вставить и в другие программы простые. Дальше сервис сам по себе должен жить. Он помещается в автозагрузку, и будет все время запускаться даже если его остановят. Он будет каждые скажем 10 минут собрать данные(gps и тд) и отправить на сервер(вроде есть код отправки, не знаю как на сайте написать получение и обработку, добавление в бд ). в следующей версий будет меню настройки, где можно выбрать время обновление. Программа как бы антикражка, но цель больше не телефон, а человек(целевая аудитория это родители, которые будут знать где ихний ребенок). Должен быть максимум простой и мало весить. У меня есть идея и код, но нет опыта в андроиде. Его я написал больше полу года назад. Не было времени заниматься. Сейчас немного есть) хочется завершить ))) нужна помощь кто может помочь с кодом. Думаю для знающего это займет всего пару дней даже если мой код он удалит и с нуля напишет). Если программа заработает то думаю разместить можно на рынок с символической оплатой от 10р/месяц. И то не программа, а чтоб смотреть на сайте карту). Преимущество от уже сделанных это малая оплата и простота. По сравнению с услугами операторов связи которые дают данные по антеннам и радиус 1 км, то тут от gps и радиус минимален)))