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

[Android] Планшеты близнецы - разные проблемы


Rusland

Вопрос

Есть два планшета Lenovo Tab 2 A7-30DC (назовем их A и Б). Есть написанная на Berlin программа с MapView.

По умолчанию у обоих стояла ОС Android 4.4.2. На A я обновил операционку до максимальной официальной версии 5.0.1, на Б оставил 4.4.2

На Б программа худо-бедно работает, но на MapView не показывает синюю точку - текущее местоположение (сторонние программы GPS Status, Яндекс Навигатор GPS координаты ловят нормально). Пробовал компилировать на Seattle - тоже самое. LocationSensor сначала неправильно показал координаты, ошибся на 300км, но после перезапуска программы стал показывать правильно. Почему MapView не показывает, не понимаю.

На А программа зависает при попытке поставить метку на MapView или нарисовать маршрут получаю Segmentation fault.

Вот, например:

procedure TFrmMain.SetMarkerOnMap(Id:integer;NaimObj,AdrObj:String;Lat,Lon:Double);
var
  Descrip: TMapMarkerDescriptor;
  MyLocation: TMapCoordinate;
begin 
  TThread.Queue(TThread.CurrentThread, procedure
  begin
    try
      if (MapView.Visible) then
      begin
        MyLocation:=TMapCoordinate.Create(Lat,Lon);
        Descrip:=TMapMarkerDescriptor.Create(MyLocation);
        Descrip.Icon:=ImObjBlueMarker.Bitmap;
        Descrip.Draggable:=False;
        Descrip.Title:=NaimObj;
        Descrip.Snippet:='['+Id.ToString+'] ';
        if (AdrObj<>'') then Descrip.Snippet:=Descrip.Snippet+AdrObj;
        MyMarker:=MapView.AddMarker(Descrip); // тут Segmentation fault
        LMarkers.Add(MyMarker);
      end; 
    except
    end;
  end);
end;

Как решить проблему?

 

 

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

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

  • 0

Решилась проблема на планшете Б - в настроках Местоположение -> Режим определения нужно было выставить Максимальная точность (а было Только по GPS). 

Осталось определить почему зависает планшет А. Есть какие-нибудь идеи?

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

Вот код постройки маршрута

procedure TFrmMain.MakeRoute(ALat,ALon,BLat,BLon:Double; ObjectName:String); // построение маршрута
var
  MC: TMapCoordinate;
begin
{$IFDEF ANDROID}
  TTask.Run(
    procedure
    begin
      mEnginel.SetOptionsGoogleDistance('AIz...IJg'); 
      mEnginel.GoogleDistance(TMapCoordinate.Create(ALat,ALon),
        TMapCoordinate.Create(BLat,BLon), mRoutePoints, mRouteInfo); 

      TThread.Synchronize(TThread.CurrentThread, 
        procedure
        var
          RoutePoints: TMapPolylineDescriptor;
        begin
          if Assigned(mPolyLine) then
            mPolyLine.Remove; // выдает Invalid class typecast

          ToastMsg('Маршрут проложен '+ObjectName+#13#10#13#10+
               '    Расстояние: ' + mRouteInfo.DistanceAsString +#13#10+
               '    Расчетное время: ' + mRouteInfo.DurationAsString);

          // рисуем маршрут
          RoutePoints := TMapPolylineDescriptor.Create(mRoutePoints);
          RoutePoints.StrokeWidth:=6;
          RoutePoints.StrokeColor:=TAlphaColorRec.Red;
          mPolyLine := MapView.AddPolyline(RoutePoints);
        end);
    end);
{$ENDIF}
end;

 

 

У меня подозрение, что ошибка происходит при обращении внутри конструкции

  TTask.Run(
    procedure
    begin

      TThread.Synchronize(TThread.CurrentThread, 
        procedure
        begin
          // тут
        end);
    end);

к глобальным переменным.
 

mPolyLine:   TMapPolyline;
MyMarker: TMapMarker;
LMarkers: TList<TMapMarker>;

это все глобальные переменные.

 

Что я делаю не так?

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

а зачем такая сложная конструкция

я делаю старорежимно

procedure TMyThread.execute();
begin
  вызов долгой операции
end;
..
th:=TMyThreadCreate(...);
th.OnTerminate:=AfterTerminate;
th.Start;
...
procedure TFrom1.AfterTerminate(...);
begin
  тут все происходит в главном потоке
end;

интуитивно вроде одно и то же, но тут мне кажется сильно понятнее

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

Попробуй вынести до потока


if Assigned(mPolyLine) then
            mPolyLine.Remove; // выдает Invalid class typecast

Вынес из потока 

  if Assigned(mPolyLine) then
    mPolyLine.Remove; 
{$IFDEF ANDROID}
  TTask.Run(
    procedure
    begin
      mEnginel.SetOptionsGoogleDistance('AIz...Jg');
      mEnginel.GoogleDistance(TMapCoordinate.Create(ALat,ALon),
        TMapCoordinate.Create(BLat,BLon), mRoutePoints, mRouteInfo); // построение маршрута

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        var
          RoutePoints: TMapPolylineDescriptor;
          mPolyLineTmp:   TMapPolyline;
        begin

          ToastMsg('Маршрут проложен '+ObjectName+#13#10#13#10+
               '    Расстояние: ' + mRouteInfo.DistanceAsString +#13#10+
               '    Расчетное время: ' + mRouteInfo.DurationAsString);

          // рисуем маршрут
          RoutePoints:=TMapPolylineDescriptor.Create(mRoutePoints);
          RoutePoints.StrokeWidth:=6; 
          RoutePoints.StrokeColor:=TAlphaColorRec.Indigo; 
          mPolyLineTmp:=MapView.AddPolyline(RoutePoints); 
          mPolyLine:=mPolyLineTmp; // ошибка перешла сюда

        end);
    end);
{$ENDIF}

mPolyLine в паблик секции

  public
    { Public declarations }
    mPolyLine:   TMapPolyline;

Почему при записи в глобальную переменную происходит ошибка?

 

 

12 часа назад, krapotkin сказал:

а зачем такая сложная конструкция

я делаю старорежимно


procedure TMyThread.execute();
begin
  вызов долгой операции
end;
..
th:=TMyThreadCreate(...);
th.OnTerminate:=AfterTerminate;
th.Start;
...
procedure TFrom1.AfterTerminate(...);
begin
  тут все происходит в главном потоке
end;

интуитивно вроде одно и то же, но тут мне кажется сильно понятнее

krapotkin, при старорежимной конструкции можно ли будет записывать в глобальную переменную? Вы пробовали?

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

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

синхронизация получается автоматическая

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, haword сказал:

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

это миллион раз обсуждалось, привет хелперам

15 часов назад, krapotkin сказал:

а зачем такая сложная конструкция

это разве сложная?

я очень активно использую TTask.Run, на всех платформах работает отлично (правда дебага нет в потоке)

2016-06-16_16-25-16.png

 

Ссылка на комментарий
  • 0
16 минут назад, ZuBy сказал:

это разве сложная?

я очень активно использую TTask.Run, на всех платформах работает отлично (правда дебага нет в потоке)

При обращении к глобальным переменным все нормально на всех устройствах?

Ссылка на комментарий
  • 0
  • Модераторы
9 минут назад, Rusland сказал:

При обращении к глобальным переменным все нормально на всех устройствах?

да, все корректно.

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

ZuBy, насколько помню вышеуказанный код брал у вас (из примера TMapsEngine)... на других устройствах работает нормально, а тут какая-то непонятка. Есть какие-нибудь идеи как решить проблему?

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Rusland сказал:

ZuBy, насколько помню вышеуказанный код брал у вас (из примера TMapsEngine)... на других устройствах работает нормально, а тут какая-то непонятка. Есть какие-нибудь идеи как решить проблему?

да код знакомый, а что внутри mRoutePoints?

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

mRoutePoints получается в procedure TMapsEngine.GoogleDistance(const aOrigin, aDestination: TMapCoordinate; out Points: TArray<TMapCoordinate>;
  out RouteInfo: TMapsEngineRouteInfo);  из Maps.Engine.pas

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы
Только что, Rusland сказал:

mRoutePoints получается в procedure TMapsEngine.GoogleDistance(const aOrigin, aDestination: TMapCoordinate; out Points: TArray<TMapCoordinate>;
  out RouteInfo: TMapsEngineRouteInfo);  из Maps.Engine.pas

не, эт я помню. есть ли там данные?

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

Да, данные есть, он не пустой.

Сейчас закомментировал эти TTask.Run и TThread.Synchronize - та же самая ошибка

 

Вот stackСтэк.png

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

Еще выяснил что на планшете А при фокусе Edit-а появляется клавиатура и тоже вываливается Segmentation fault. Вот stack (кстати очень похож на предыдущий)

Стэк2.png

На планшете Б все нормально. Ну что за дела?? 

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

 

В 16.06.2016 в 13:29, ZuBy сказал:
В 16.06.2016 в 11:09, haword сказал:

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

это миллион раз обсуждалось, привет хелперам

Что вы имеете ввиду, как хелперы помогают в данном вопросе? И какую тему стоит посмотреть про них?

 

Ссылка на комментарий
  • 0
  • Модераторы
15 часов назад, Pax Beach сказал:

Что вы имеете ввиду, как хелперы помогают в данном вопросе? И какую тему стоит посмотреть про них?

конкретно загрузка картинок делается так

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

конкретно загрузка картинок делается так

Да, решение хорошее, спасибо за него.

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

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, Pax Beach сказал:

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

хелпер помогает расширять функционал, вариантов его использования может быть много.

с выходом Берлина все стало хуже в плане использования хелперов, т.к. нам отрезали доступ к приватным переменным объекта/компонента/и тд.

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

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

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

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

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

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

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

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

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

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