Перейти к содержанию
  • Регистрация
  • 0
Евгений Корепов

Выполнение регулярных операций в сервисе - статистика

Вопрос

Провел небольшое исследование поведения таймера Posix в сервисе. Результаты не очень. Таймер ведет себя так же как и в приложении, главное отличие - не умирает окончательно, но рассчитывать на него не стоит.

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

2017-02-24 23:22:51 - телефон ушел в сон. Таймер начал работать эпизодически, с провалами до получаса.

2017-02-25 07:24:58 - я проснулся и разблокировал телефон. Таймер опять нормально заработал.

В следующей серии попробую протестировать сервис с AlarmManager, что то у меня подозрения что результаты будут не лучше.

2017-02-25 07:27:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 108
2017-02-25 07:26:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 107
2017-02-25 07:25:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 106
2017-02-25 07:24:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 105
2017-02-25 07:21:05	Posix-таймер в сервисе. Запрос раз в 60 сек. № 104
2017-02-25 07:14:00	Posix-таймер в сервисе. Запрос раз в 60 сек. № 103
2017-02-25 07:01:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 102
2017-02-25 06:46:33	Posix-таймер в сервисе. Запрос раз в 60 сек. № 101
2017-02-25 06:24:50	Posix-таймер в сервисе. Запрос раз в 60 сек. № 100
2017-02-25 06:13:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 99
2017-02-25 05:51:32	Posix-таймер в сервисе. Запрос раз в 60 сек. № 98
2017-02-25 05:30:07	Posix-таймер в сервисе. Запрос раз в 60 сек. № 97
2017-02-25 05:16:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 96
2017-02-25 05:07:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 95
2017-02-25 05:00:41	Posix-таймер в сервисе. Запрос раз в 60 сек. № 94
2017-02-25 04:41:01	Posix-таймер в сервисе. Запрос раз в 60 сек. № 93
2017-02-25 04:21:19	Posix-таймер в сервисе. Запрос раз в 60 сек. № 92
2017-02-25 04:00:40	Posix-таймер в сервисе. Запрос раз в 60 сек. № 91
2017-02-25 03:41:33	Posix-таймер в сервисе. Запрос раз в 60 сек. № 90
2017-02-25 03:16:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 89
2017-02-25 03:02:01	Posix-таймер в сервисе. Запрос раз в 60 сек. № 88
2017-02-25 02:44:54	Posix-таймер в сервисе. Запрос раз в 60 сек. № 87
2017-02-25 02:23:49	Posix-таймер в сервисе. Запрос раз в 60 сек. № 86
2017-02-25 02:10:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 85
2017-02-25 01:52:11	Posix-таймер в сервисе. Запрос раз в 60 сек. № 84
2017-02-25 01:32:57	Posix-таймер в сервисе. Запрос раз в 60 сек. № 83
2017-02-25 01:28:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 82
2017-02-25 01:27:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 81
2017-02-25 01:26:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 80
2017-02-25 01:25:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 79
2017-02-25 01:10:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 78
2017-02-25 01:00:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 77
2017-02-25 00:38:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 76
2017-02-25 00:19:22	Posix-таймер в сервисе. Запрос раз в 60 сек. № 75
2017-02-25 00:01:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 74
2017-02-24 23:51:15	Posix-таймер в сервисе. Запрос раз в 60 сек. № 73
2017-02-24 23:30:37	Posix-таймер в сервисе. Запрос раз в 60 сек. № 72
2017-02-24 23:22:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 71
2017-02-24 23:21:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 70
2017-02-24 23:20:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 69
2017-02-24 23:19:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 68
2017-02-24 23:18:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 67
2017-02-24 23:17:52	Posix-таймер в сервисе. Запрос раз в 60 сек. № 66
2017-02-24 23:16:52	Posix-таймер в сервисе. Запрос раз в 60 сек. № 65

 

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Скорей всего режим Doze Mode (Android 6.0+) не будет нормально давать работать, что в принципе и правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Равиль Зарипов (ZuBy) сказал:

Скорей всего режим Doze Mode (Android 6.0+) не будет нормально давать работать, что в принципе и правильно

Тестировал на 5 андроиде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Попробовал AlarmManager. Интервал 30 секунд.

Запускал сервис следующим образом:

procedure TFormMain.InitServiceAlarmManager;
var Intent: JIntent;
    PendingIntent: JPendingIntent;
    ATimerInterval : Integer;
begin
  ATimerInterval:=30;
  Intent := TJIntent.Create;
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceTest090Service'));
  PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0);
  TAndroidHelper.AlarmManager.&setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(ATimerInterval),
    ATimerInterval * 1000, PendingIntent);
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  InitServiceAlarmManager;
//  FService:=TLocalServiceConnection.Create;
//  FService.StartService('ServiceTest090Service');
end;

function TFormMain.getTimeAfterInSecs(Seconds: Integer): Int64;
Var Calendar: JCalendar;
begin
  Calendar := TJCalendar.JavaClass.getInstance;
  Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
  Result := Calendar.getTimeInMillis;
end;

end.

Результат - та же хрень, вид сбоку:

2017-02-25 21:35:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:35:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:34:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:34:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:33:38	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:33:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:45	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:31:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:30:59	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
А тут я заблокировал телефон кнопкой и началось....
2017-02-25 21:30:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:29:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:29:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:28:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:28:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:27:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:27:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:26:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:26:07	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:25:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:25:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.

Оставлю на ночь, посмотрим что будет....

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Так устройство же спать ложится, смысл запускать сервис, когда он не нужен или есть причина?

А вообще, я как-то заморачивался с похожей проблемой и вроде нашёл то ли флаг, то ли ещё что-то. Смысл был в том, чтобы будить устройство, но не включать дисплей.

Кстати, HTC точно надо принудительно будить, у них ОСь так устроена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Результаты ночного теста получились удивительными! AlarmManager отработал на ура (И кстати на HTC). Результаты можно посмотреть здесь http://kayfolom.ru/index.php?cmd=read&api_key=androidservicetest089

Правда есть некие странности, но думаю это проблемы моего кода. 

Некоторые вызовы удваиваются и утраиваются вот так (должно быть раз в 60 сек): 

2017-02-26 01:28:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:27:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:26:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:26:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:25:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.

Я читал что при некоторых флагах возможен экономичный вызов будильников - ближайшие по времени будильники вызываются в одно время, дабы не будить устройство лишний раз. Может тут как раз такой случай.

Вот код сервиса:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  SendRequest;
  Result:=TJService.JavaClass.START_NOT_STICKY;
end;

procedure TDM.SendRequest;
Var Query : String;
    AMessage,AAPIKey : String;
begin
  AAPIKey:='androidservicetest089';
  AMessage:='AlarmManager в сервисе. Запрос раз в '+TimerInterval.ToString+' сек.';
  Query:='http://kayfolom.ru/index.php?cmd=write&api_key='+AAPIKey+'&message='+AMessage;
  FHTTPThread:=THTTPThread.Create(Query);
end;

Поток с   FreeOnTerminate:=True;

Вроде все нормально...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 часов назад, Andrey Efimov сказал:

Так устройство же спать ложится, смысл запускать сервис, когда он не нужен или есть причина?

А вообще, я как-то заморачивался с похожей проблемой и вроде нашёл то ли флаг, то ли ещё что-то. Смысл был в том, чтобы будить устройство, но не включать дисплей.

Кстати, HTC точно надо принудительно будить, у них ОСь так устроена.

Я знаю как на этом форуме относятся к идеям заставить мобильное устройство что то мониторить круглые сутки - начинаются крики "Ересь! Это не возможно! Сжечь его на костре пока не поздно!" :-)

Но я считаю что в нашей области нужно ограничиваться только фантазией и не слушать запретителей и ограничителей.

Задача у меня следующая - есть несколько моих приложений мониторинга майнинга криптовалюты, нужно добавить туда возможность мониторить круглые сутки воркеров (на человеческом языке это комп с 5-6 видеокартами, так называемая "ферма", или аппаратный модуль майнинга). В ответ на "сожрет батарею нафик" - одна ферма может зарабатывать от нескольких сотен рублей, до нескольких тысяч долларов в сутки, и понятно что человеку имеющему шанс потерять много денег, лучше узнать вовремя о зависании фермы в 23:15, чем обнаружить это утром и потерять деньги. С ужасной трагедией в виде севшего на 20% больше чем обычно аккумулятора телефона он, после многолетнего посещения психотерапевтов, думаю смирится.

Ответ на "Пуши наше все - поднимай сервер, пусть он мониторит и отсылает пуши"  - на одном майнинговом пуле может быть несколько тысяч майнеров (людей) и у каждого по несколько десятков или сотен ворекров (ферм). Если проверять с периодичностью в 10 минут, то нужно будет отослать за этот период несколько десятков тысяч запросов, обработать их (хранить историю каждого). Если не договорится с пулом, он за такое забанит. Если произойдет сбой - я понесу вину за потерю пользователями больших денег.

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

 

По поводу флага - метод RTC_WAKEUP вроде так и работает, будит телефон для выполнение задачи, но экран не включается. По крайней мере в варианте getService. У меня экран телефона всю ночь был выключен, запросы шли стабильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Евгений Корепов сказал:

Я знаю как на этом форуме относятся к идеям заставить мобильное устройство что то мониторить круглые сутки - начинаются крики "Ересь! Это не возможно! Сжечь его на костре пока не поздно!" :-)

:D Ну, не знаю как остальным, мне просто была интересна сама задача. И задачка интересная :)

1 час назад, Евгений Корепов сказал:

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

Только ещё не помешает мониторить перезагрузку телефона. А то пользователь перезагрузит устройство и всё, сломается его мониторинг (до момента пока он не перезапустит мониторинг)... Это если хочется почти нон-стоп и в автоматическом режиме.

1 час назад, Евгений Корепов сказал:

По поводу флага - метод RTC_WAKEUP вроде так и работает, будит телефон для выполнение задачи, но экран не включается. По крайней мере в варианте getService. У меня экран телефона всю ночь был выключен, запросы шли стабильно.

Да, точно. Видимо, я перепутал с другой задачей и другой реализацией, давно это было. (надо будет освежить знания по этой теме)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
36 минут назад, Andrey Efimov сказал:

Только ещё не помешает мониторить перезагрузку телефона. А то пользователь перезагрузит устройство и всё, сломается его мониторинг (до момента пока он не перезапустит мониторинг)... Это если хочется почти нон-стоп и в автоматическом режиме.

С этим согласен. Но тут нужен java класс, компиляция его в jar, подключение jar к проекту - вот на это все у меня жуткая аллергия. Вчера пытался воспользоваться вашим bat-файлом, потом просто отдельными строками, в итоге психанул и все удалил :-) Особенно тяжело мне дается неясная необходимость во вложенных папках для класса, не понятно в какой именно папке запускать javac. Понимаю что создатели java любили линукс, и там засранные тысячами файлов папки, чудовищная иерархия вложенных папок и прочие чудеса считаются нормой. Но я воспитан в строгости и порядке, для меня в порядке вещей если исполняемый файл сам выясняет из какой папки был запущен и где искать свои *.ini, *.cfg, библиотеки и подобные файлы. 

Сейчас буду бороться с задвоенными вызовами будильника, видимо не до конца понимаю принципы работы сервиса в андроиде. AlarmManager вроде не при чем, в документации сказано что нельзя создать два одинаковых будильника на одно время. Или мне все же это удалось :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 26.02.2017 в 13:32, Евгений Корепов сказал:

С этим согласен. Но тут нужен java класс, компиляция его в jar, подключение jar к проекту - вот на это все у меня жуткая аллергия. Вчера пытался воспользоваться вашим bat-файлом, потом просто отдельными строками, в итоге психанул и все удалил :-) Особенно тяжело мне дается неясная необходимость во вложенных папках для класса, не понятно в какой именно папке запускать javac. Понимаю что создатели java любили линукс, и там засранные тысячами файлов папки, чудовищная иерархия вложенных папок и прочие чудеса считаются нормой. Но я воспитан в строгости и порядке, для меня в порядке вещей если исполняемый файл сам выясняет из какой папки был запущен и где искать свои *.ini, *.cfg, библиотеки и подобные файлы. 

Сейчас буду бороться с задвоенными вызовами будильника, видимо не до конца понимаю принципы работы сервиса в андроиде. AlarmManager вроде не при чем, в документации сказано что нельзя создать два одинаковых будильника на одно время. Или мне все же это удалось :-)

Вам хорошо с AlarmManager, а что делать любителям iOS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, wamaco сказал:

Вам хорошо с AlarmManager, а что делать любителям iOS?

 

Можно об этом поподробнее? На днях как раз собираюсь iOS версию делать, и там нужен будет Alarm Manager. Т.е. там его нет? Как тогда можно запускать запланированные задания? Сервис в фоне?

Изменено пользователем ENRGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Так в том то и дело, что сервисов в iOS нет!  Безопасность.

Запланированные задания в iOS не запустить! Как сделать? Слать пуш, с призывом открыть приложение и что то совершить! :))

В iOS подход как в Android не прокатит!

Изменено пользователем wamaco

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Цитата

Слать пуш, с призывом открыть приложение и что то совершить! :))

 

Офигеть. А для пуша нужно подключение к интернет верно? А для пуша нужен свой сайт на хостинге? Или можно как -то использовать сервера Apple?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 часов назад, ENRGY сказал:

Офигеть. А для пуша нужно подключение к интернет верно? А для пуша нужен свой сайт на хостинге? Или можно как -то использовать сервера Apple?

в этой теме есть упоминание про сервис kinvey, возможно вам подойдёт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В MIUI вообще сервисы Delphi не запускаются.

Всем обладателям Xiaomi привет!

Отключил энергосбережение, предоставил приложению все привилегии. Смартфон ведет себя как iPhone.

Может кто-то знает как это лечится?

Redmi 4, Andorid 6.0.1, MIUI Global 8.0.

Изменено пользователем Pax Beach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 24.03.2017 в 19:11, Pax Beach сказал:

В MIUI вообще сервисы Delphi не запускаются.

Проверил, запускает и работает (Xiaomi Redmi Note 4 MIUI Global 8.5).

Но вот наблюдаю такую проблему:

Есть сервис, который при старте делает POST-запрос и создает "будильник", для последующего перезапуска самого себя:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: integer): integer;
begin
  Result := TJService.JavaClass.START_STICKY; // тут может быть и START_NOT_STICKY - это не важно

  SendPost('post запрос до сервера');            

  PendIntent();
end;

procedure TDM.PendIntent(); 
var
  Intent: JIntent;
  PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString('60sec'));
  Intent.setClassName(TAndroidHelper.Context,
    StringToJString('com.embarcadero.services.CabSrv'));

  PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context,
    1, Intent, 0);

  TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP,
    getTimeAfterInSecs(60), PendingIntent); // раз в минуту вызываем сервис
end;


procedure TDM.SendPost(txt: string);
var
  aResponse: IHTTPResponse;
  aResponser: TResponser;
  sStream: TStringStream;
  aHttpClient: TNetHTTPClient;
  sList: TStringList;
begin 
  TTask.Run(
    procedure
    begin
      try
        aHttpClient := TNetHTTPClient.Create(nil);        
        aHttpClient.OnValidateServerCertificate := OnValidateServerCertificate;        
        aHttpClient.AcceptLanguage := 'ru,en;q=0.8';
        aHttpClient.ContentType := 'application/x-www-form-urlencoded';
        aHttpClient.AcceptCharset := 'utf-8';
        aHttpClient.Accept :=
          'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8';

        sStream := TStringStream.Create();
        sList := TStringList.Create;
        sList.Add('txt=' + txt);
        
        try        
          aResponse := aHttpClient.Post(Sets.Host, sList, sStream);          
        finally
          if ((sStream <> nil) and (aResponse <> nil)) then
          begin            
            Log('SendPost OK');
          end
          else
            Log('SendPost Error');
          sStream.Free;
          sList.Free;
        end;
      finally
        aHttpClient.Free;
      end;

    end);
end;

Так вот если выгрузить программу (сервис перезапускается) и выключить экран, то через несколько минут сервис не может достучаться до сервера.

except java.net.SocketTimeoutException: connect timed out

В чем может быть проблема и как ее решить?

 

 

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 11.09.2017 в 17:09, Rusland сказал:

Проверил, запускает и работает (Xiaomi Redmi Note 4 MIUI Global 8.5).

Так вот если выгрузить программу (сервис перезапускается) и выключить экран, то через несколько минут сервис не может достучаться до сервера. В чем может быть проблема и как ее решить?

 

 

Проблема в MUI.

Предполагаю, что надо искать решение в запросе разрешений на уведомления, разбудить телефон, показать приложение поверх других окон, еще что-нибудь такое. Потому что в MUI большой упор на энергосбережение, безопасность и спам.

Я замучился уже с MUI, не для разработчиков ось =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.09.2017 в 14:34, Pax Beach сказал:

Потому что в MUI большой упор на энергосбережение

Переключил режим Энергосбережения с Оптимальный на Отключено и сразу проблема с коннектом пропала :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Светлана
      Ну всё в принципе как всегда, либо я барашка, либо лыжи не едут)
      А всё просто - я хочу, чтобы пока данные с сервера загружались по клику кнопки, пользователю элементарно был отклик в виде крутящейся какой нибудь фигни и он видел, что процесс идёт и что прога не зависла и никуда лишний раз не тыкал.
      Пока что для тестов сделала элементарно кнопку Update (speedbutton с image), данные элементарно грузятся и отображаются в GridPanel, а поверх него, чтоб пользователь и не смог куда либо тыкнуть, замостила панелькой с Image, вращаемой по таймеру (всё это дело наверху Visible:=false). И когда клацаем по кнопке Update, то панельку сверху грида делаю отображаемой и запускаю таймер, потом этот же обработчик/процедура грузит данные, а по окончанию останавливаем таймер и скрываем полупрозрачну, еще кстати, панельку. Аля вот так:
      procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin //отображаем лого загрузки P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; //с запуском таймера GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется //и скрывае лого загрузки Timer_load_rotate.Enabled := false; //уже в обратном порядке P_showLoad.Visible := false; end; иии... ни черта не происходит как я хочу(
      Это лого вообще в итоге не отображается, а если убрать его скрытие, то оно у нас отобразится уже только тогда, когда всё загрузится. Логика мне стала подсказывать, что следовало его как то отобразить выполнив в параллельном асинхронном потоке аля так:
      procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin TThread.Queue(TThread.Current, //TThread.Queue TThread.Synchronize ForceQueue procedure() begin P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; end); GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется end; И опять оно отображается только после того, как всё загрузится и проработает вся процедура. И уже чего только не пробовала и Synchronize и ForceQueue; и через TTask.Run и |task := TTask.Create(procedure () ... и т.д.| ничего не подходит, вот хоть убейся это всё дело будет отображаться только после полной отработки процедуры клика. Может я не в том направлении вообще рою и это как то по другому делается? Может я еще пока отлаживаю на Win32, а не всё на android, а там вот пара вариантов и норм на нём работают? Но чтот я никак не могу понять, что к чему... должно же быть как то просто, а я чтот никак не могу понять как(
    • От ComAlex
      Goоgle Play перестает поддерживать 32-bit Android-приложения c 01.08.2019.
      А выкладывать в Goоgle Play новые УЖЕ нельзя.
      Последние же Delphi XE не позволяют создать 64-bit Android-приложения.
      Кто знает, когда появится новая версия с поддержкой 64 - bit? Говорили, что в конце лета, но лето кончилось
    • От ComAlex
      Здравствуйте, господа программисты!
      Пытаюсь протестировать Android приложение на любом эмуляторе.
      Всегда одна ошибка "Unable to create process: Performing Streamed Install"
      Понимаю, что ссылок много по данной теме в интернете, но ни одна не помогла.
      Использую Embarsadero Delphi 10.3
      При компиляции на реальный телефон всё работает
      При компиляции на эмулятор даже пустого приложения выдается та же ошибка
      "Unable to create process: Performing Streamed Install"
      В чем проблема? Хотя бы в какую сторону копать?
    • От Дмитрий Потапов
      Задался идеей написания IPTV приложения "для себя", в котором при желании смог бы реализовать что-то необходимое и удалить то, что не нужно.
      Собственно вопрос в другом: Я написал простое приложение, которое отлавливает коды кнопок с пульта, приложение по сути самое банальное, использует OnKeyDown и OnKeyUp (чисто для теста). И по нажатию на кнопку на пульте высылает например в Memo или ListBox Информацию о нажатой кнопке (включая ее код).
      Но суть в том, что далеко не все кнопки таким образом распознаются. Для примера:
      Кнопки громкости, назад, домой, увеличение\уменьшение громкости, стрелки(влево, вправо, вверх, вниз) и центральная кнопка (по совместительству OK).
      Цифры все определяются, как одна - 0
      Кнопки, которые не определяются (не срабатывает событие, ибо если был бы неизвестен код, то думаю, в таком случае получил бы все, кроме кода кнопки), но по нажатию кнопки, которая не определяется приложением - ничего не происходит вообще.
       
      Вопрос: Есть ли возможность как-то "научить" приложение распознавать эти кнопки? (Я где-то читал, может даже и здесь, что это все так реализовано именно на уровне самого FireMonkey, будто этих кнопок вообще не существует).
      Если эта тема уже поднималась на форуме или вопрос очень просто решается - извиняюсь)
      Решение: http://fire-monkey.ru/topic/5624-как-отловить-кнопки-пульта-ду/?do=findComment&comment=36399
       
    • От Татьяна
      Здравствуйте!
      Как можно из Android приложения узнать электронный адрес пользователя gmail (если он был настроен, конечно). Где-то же он сохраняется, если Google Play знает.
    • От msp888
      Всем привет! 
      У меня уже несколько лет работают приложения под Windows и под Andriod, в которых выполняется обмен данными по локальной сети по протоколу TCP-IP. Теперь вот мне понадобился прием multicast-пакетов по протоколу UDP. Под Windows всё работает замечательно, а вот под Android ничего принять не могу... 
      Подскажите чего не хватает, или дайте ссылку на пример, где уже реализовано подобное...
      Вот выдержки из кода:
      // переменные FSocket:TSocket; FiAR:IAsyncResult; FasyncWE:TMultiWaitEvent; data:TBytes; res:TWaitResult; WifiLock: JWifiManager_WifiLock; MulticastLock: JWifiManager_MulticastLock; ... // регистрация в группе procedure AddMemberShip(MultiAddr, InterfaceAddr:Cardinal); var Mreq:ip_mreq; begin fillchar(Mreq, SizeOf(Mreq), 0); move(MultiAddr, Mreq.IMR_MultiAddr.S_addr, SizeOf(Mreq.IMR_MultiAddr.S_addr)); move(InterfaceAddr, Mreq.IMR_Interface.S_addr, SizeOf(Mreq.IMR_Interface.S_addr)); CheckSocketResult(setsocketoption(FSocket.Handle, IPPROTO_IP, IP_ADD_MEMBERSHIP, Mreq, SizeOf(Mreq)), 'setsockopt:IP_ADD_MEMBERSHIP'); end; ... // permission... ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION ACCESS_NETWORK_STATE ACCESS_WIFI_STATE CHANGE_CONFIGURATION CHANGE_NETWORK_STATE CHANGE_WIFI_MULTICAST_STATE CHANGE_WIFI_STATE INTERNET READ_CALENDAR READ_EXTERNAL_STORAGE WRITE_CALENDAR WRITE_EXTERNAL_STORAGE WAKE_LOCK ... // настройка wi-fi WifiLock.acquire; MulticastLock.acquire; ... // создание и настройка сокета FSocket:=TSocket.Create(TSocketType.UDP); FSocket.Bind(TNetEndpoint.Create(ServerIP, ServerPort)); AddMemberShip(TIPAddress.Create(239, 78, 1, 1).Addr.S_addr, ServerIP.Addr.S_addr); AddMemberShip(TIPAddress.Create(239, 78, 1, 2).Addr.S_addr, ServerIP.Addr.S_addr); AddMemberShip(TIPAddress.Create(239, 78, 1, 78).Addr.S_addr, ServerIP.Addr.S_addr); ... // Прием данных в потоке... FiAR:=FSocket.BeginReceiveFrom; FasyncWE:=FiAR.AsyncWaitEvent; res:=FasyncWE.WaitFor; if res = wrSignaled then data:=FSocket.EndReceiveBytesFrom(FiAR); // Прием  
    • От Brovin Yaroslav
      Хочу поделиться с вами знаковой новостью для развития библиотеки FGX Native. Официально выпущено первое Андроид приложение в Google Play Market. 
      Это приложение разработано Станиславом(@sinuke) для учащихся лицея по специальности "Почтовая связь". Оно одновременно является и полным конспектом, который всегда под рукой, и системой проверки своих знаний.
      Полностью разработано на Delphi и стандартных компонентах альфа версии FGX Native 0.9.7.0 в Delphi 10.3 Community Edition. Быстрые списки, гибкая разметка, продвинутая навигация, анимации переходов, поддержка тем и многое другое. Это лишь малая часть того, что было задействовано из текущих возможностей библиотеки.
      Приложение опубликовано в Google Play Market. Вы можете уже прямо сейчас скачать и протестировать приложение самостоятельно, загрузив его по ссылке (https://play.google.com/store/apps/details?id=com.sinukeapps.post).
      Оставляйте свои комментарии и предложения. Они помогут сделать приложение лучше, а FGX Native еще удобнее и стабильнее.
      Релиз первого приложения с использование библиотеки FGX Native - это результат огромной работы, проделанной за эти годы. В тоже время, это сигнал того, что библиотека обладает достаточным минимумом для создания типовых Андроид приложений.
      Ну, и пожалуй самое приятное, это то, что библиотека готова к бета тестированию, которое откроется в ближайшее время.  О начале закрытого бета тестирования будет сообщено позже.
      Отдельное спасибо участникам закрытого альфа тестирования за поддержку, тестирование и идеи по улучшению библиотеки. В настоящее время участниками тестирования ведутся и другие интересные проекты на базе FGX Native, о которых я расскажу позже.
      Следите за новостями.
      Приложение: https://play.google.com/store/apps/details?id=com.sinukeapps.post Автор: Станислав Игнатович @sinuke Минимальные системные требования: Android 5.0 и arm v7         
    • От Yarpda
      В серьезных приложениях (Сбербанк-онлайн или Ютюб и т.п.) когда выходят обновления с новыми функциими, они запускают своеобразный интерактивный ролик. Когда экран затемняется и остается не затемненным только новый элемент экрана например, а на затемненном фоне описывается что делает этот новый элемент.Потом все это плавно переходит к другому элементу и т.д. Выглядит все довольно красиво.
      Задался вопросом, как сделать что-то подобное под FMX. Для себя не нахожу никаких очевидных решений.
      Подскажите если кто знает, направления решения этой задачи?
      Заранее спасибо.
    • От RADStudioDeveloper
      Привет всем!
      Есть необходимость в проекте для Android Delphi FMX (RAD Studio 10.2.3 Tokyo / RAD Studio 10.3.1 Rio ) сохранять изображения с фотокамеры смартфона Android через WiFi соединение в удалённую базу данных Microsoft SQL сервера в поле BLOB.
       
      Подскажите, пожалуйста,  возможные решения, примеры Delphi кода и требуемые компоненты для работы с камерой и SQL сервером через WiFi на Android устройствах.
    • От Евгений Корепов
      Простое приложение для андроид - форма, на ней TWebBrowser. В WebBrowser открываем что то требующее разрешение на геолокацию. У примеру https://www.openstreetmap.org 
      В обычном браузере, при тыке на "Показать мое местоположение" появится popup окно с запросом разрешения на "Доступ к данным о вашем местоположении".
      Но в Delphi приложении описанном выше никакого запроса не приходит. ?
      Нашел решение для java https://forums.fusetools.com/t/geolocation-not-enabled-in-webview-on-android/1374 
      В функцию создания WebView 
      public static Object CreateWebView321(final boolean zoomEnabled,final boolean scrollEnabled) { ScrollableWebView wv = new ScrollableWebView(com.fuse.Activity.getRootActivity()); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setUseWideViewPort(true); //enabled viewport meta tag wv.getSettings().setLoadWithOverviewMode(true); //mimic iOS Safari and Android Chrome wv.getSettings().setSupportZoom(zoomEnabled); wv.getSettings().setBuiltInZoomControls(zoomEnabled); wv.getSettings().setDomStorageEnabled(true); wv.setAllowScroll(scrollEnabled); return wv; } рекомендуется добавить следующий код
      wv.getSettings().setGeolocationEnabled(true); wv.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { callback.invoke(origin, true, false); } }); В модуле FMX.WebBrowser.Android.pas это выглядит так
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end; Вот суть вопроса - добавить delphi код. Пробую что то вот такое, но закончить ума не хватает
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.setWebChromeClient( TJWebChromeClient.Create.onGeolocationPermissionsShowPrompt( origin: JString; callback: JGeolocationPermissions_Callback);..... FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end;  
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...