Перейти к содержанию
Fire Monkey от А до Я
  • 0

TMapView завешивает программу


BMW006

Вопрос

Помогите, замучился уже. Решения так и не нашел.

Суть такова.

На форме стоит всего один TMapView мы создаем маркер и меняем его позицию (удаляем маркер, создаем новый) создавая видимость перемещения маркера по карте. Так вот если мы в момент установки маркера переключимся на другую задачу и снова вернемся в приложение, оно намертво зависает. Отключаем выставление маркеров и все работает. Что я только не делал. Запрещал выставлять маркеры когда : TApplicationEvent.EnteredBackground , TApplicationEvent.WillBecomeInactive  при FormSaveState, ставил процедуру в поток и так. Ничего не вышло.

Процедура создания маркера простая.

 

Цитата

procedure THeaderFooterForm.SetMarker;
begin

 TThread.Synchronize(nil, procedure
  begin

    try


       If Assigned(MarkerMap) Then MarkerMap.DisposeOf;

        MapLocation:=TMapCoordinate.Create(Lat,Long);

        MapView1.Location:=MapLocation;

        MarkerMapDescr:=TMapMarkerDescriptor.Create(MapLocation);
        MarkerMapDescr.Icon := Image1.Bitmap;
        MarkerMapDescr.Draggable:=True;

        MarkerMapDescr.Title:='TEST';
        MarkerMapDescr.Snippet:='TEST';

        MarkerMap:=MapView1.AddMarker(MarkerMapDescr);

    except
    end;

 End);

end;

 

То есть например если запрашивать SetMarker по циклу с изменением координат, а потом переключиться на иную задачу и вернуться, все будет висеть намертво. Почему так и как избавится. Помогите нет уже сил.

P.S.:

XE 10.1 (Проверял на двух независимых ПК)

Изменено пользователем BMW006
Ссылка на комментарий

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

  • 0
1 час назад, wamaco сказал:

Отключите создание маркеров при переключении на другую задачу...

При возвращении... продолжайте выставлять!

Делал так, описал выше.

 

Цитата

Запрещал выставлять маркеры когда : TApplicationEvent.EnteredBackground , TApplicationEvent.WillBecomeInactive  при FormSaveState

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

Все свои варианты исчерпал.

Ссылка на комментарий
  • 0
18 часов назад, Yuriy2606 сказал:

Добрый день. Та же проблема. Бьюсь уже 3 дня. Уже думаю уходить на Android Studio ? Смогли решить? Или может кто-то подскажет...

Сходите на Android Studio! После мытарств там, ждем обратно! ?

По-делу.... что конкретно не получается?

Ссылка на комментарий
  • 0
  • Модераторы
В 18.11.2018 в 00:33, Yuriy2606 сказал:

Добрый день. Та же проблема. Бьюсь уже 3 дня. Уже думаю уходить на Android Studio ? Смогли решить? Или может кто-то подскажет...

Попробуйте обернуть в поток с синхронизацией

Ссылка на комментарий
  • 0

Здравствуйте коллеги. Приятно, что есть люди, готовые помочь :)

Проблема следующая: Программа содержит карту MapView на которую наносятся маркеры в динамике (раз в 10 сек передвигаются машинки по карте). Все нормально работает пока я не перейду к другой активности. После возобновления моей активности, с вероятностью 50\50, приложение не отображается, просто черный экран, иногда на черном экране появляются кнопки Google карты. Помогает снятие процесса приложения и запуск его заново. Проверено на двух девайсах. Методом логирования я вычислил, что приложение падает тут:

  begin
    try
    mapPolygon.DisposeOf; //тут исключение
    except
    end;
    SetLength(Outline,5);
    Outline[0]:=TMapCoordinate.Create(VLLat, VLLon);
    Outline[1]:=TMapCoordinate.Create(VLLat, NPLon);
    Outline[2]:=TMapCoordinate.Create(NPLat, NPLon);
    Outline[3]:=TMapCoordinate.Create(NPLat, VLLon);
    Outline[4]:=TMapCoordinate.Create(VLLat, VLLon);
    Plg:=TMapPolygonDescriptor.Create(Outline);
    Outline:=nil;
    Plg.StrokeColor := TAlphaColorRec.Slateblue;
    Plg.StrokeWidth := 3;
    Plg.Geodesic := True;
    Plg.ZIndex := 0.9;
    //Plg.FillColor := TAlphaColorRec.Yellow;
    try
    mapPolygon := Form1.MapView1.AddPolygon(Plg); //зависает тут, и это при наличии try except
    except
    end;
  end;

Ставил перехват события сворачивания приложения и запрет на обновление карты при этом. Но это не помогло. В приложении используются потоки типа:

 TThread.CreateAnonymousThread(procedure ()
  begin

          TThread.Synchronize(nil,
          procedure
          begin
             
          end);

 
  end).Start;

Вышеуказанная отрисовка в основном потоке, по таймеру. Может в  этом причина? Одним словом не знаю что делать. Пока смирился, но надеюсь на лучшее.

И еще, вычислил только что: в приложении используется LocationSensor1.Sensor и для отладки я использую FakeGPS. Почему-то LocationSensor1.Sensor в большинстве случаев выдает правильные координаты из FakeGPS, а иногда те, которые он получает по wifi/gsm. При этом на улице, с отключеным Fake GPS, наблюдается то же самое, но реже. Это странно. При этом синяя точка на карте отображается в правильном месте.

Может кто-то сталкивался? Заранее спасибо за ответы. :)

10.1 Berlin

Изменено пользователем Yuriy2606
Ссылка на комментарий
  • 0

Здравствуйте коллеги.

Проблему с зависанием приложения решил при помощи отслеживания Hide приложения и MapView1.Visible:=false;

Соответственно при возобновлении активности делаю MapView1.Visible:=true; Зависания почти пропали на 90%.

Прыгающий GPS я победил отключением WiFi/GSM локации. Оставил только GPS. Как-то это костыльно, масса пользователей

до этого не догадаются и на карте будет куча прыгающих машин.

Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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