Delphi Привязка Android Сервис - PullRequest
0 голосов
/ 09 февраля 2020

Я тестирую привязку на Delphi.

Все хорошо работает в приложениях Windows 10 (как стандартное приложение, так и сервис). Все также хорошо в стандартном приложении android.

Проблемы в Android сервисе. Я могу подключиться с внешнего клиента к модему android, получать и отправлять ресурсы и т. Д. c. Но следующие методы и события не работают: соединение от клиента (AutoConnect), OnEndManagersDiscovery, OnEndProfileDiscovery, OnNewManager не запускается и т. Д. c ..

Я не мог выяснить причину, почему это было происходит ...

Кто-нибудь знает, где может быть ошибка?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

, если вы выполняете AutoConnect без тайм-аута, чем событие EndofAutoConnect запускается! обнаружил, что сегодня ...

0 голосов
/ 09 февраля 2020

Мне не удалось это сделать, поэтому я подробно изучил исходный код System.Tether.Manager (то же самое относится и к System.Tether.AppProfile) и, скорее всего, нашел причину проблемы.

Когда выполняется команда TetheringManager.DiscoverManagers, событие не возникает, но если после этой команды выполняется оператор TetheringManager.RemoteManagers, отображаются все окружающие устройства.

Проблема заключается в том, что библиотека использует TThread . Синхронизировать функцию для синхронизации событий. Эта функция требует основного потока пользовательского интерфейса для его функциональности. Эта функция не имеет службы android. Таким образом обновление события происходит сбой каждый раз (например, onEndManagersDiscovery). Библиотека не предназначена для использования в сервисе android.

procedure TTetheringManager.DoEndManagersDiscovery(const ARemoteManagers: TTetheringManagerInfoList);
begin
  RegisterManagers(ARemoteManagers);
  if Assigned(FOnEndManagersDiscovery) then
  begin
    if SynchronizeEvents then
      TThread.Synchronize(nil,
        procedure
        begin
          FOnEndManagersDiscovery(Self, ARemoteManagers);
        end)
    else
      FOnEndManagersDiscovery(Self, ARemoteManagers);
  end
end;

Интересно, например, что событие OnRequestStorage работает, потому что оно использует непосредственно FOnRequestStorage (Self, AStorage) вместо TThread.Synchronize для обновления event.

procedure TTetheringManager.DoRequestStorage(var AStorage: TTetheringCustomStorage);
begin
  AStorage := nil;
  if Assigned(FOnRequestStorage) then
    FOnRequestStorage(Self, AStorage);
end;

Обновление : Теперь я обнаружил, что самым простым способом решения этой проблемы будет отключение SynchroniyeEvents для стенда TetheringManager и TetheringAppProfile.

...