1

У меня вопрос о том, как сделать навигационное приложение более быстрым и стабильным.Проблема с производительностью на Android-навигаторе MapView

Основной слой моего приложения - это простой вид на карту, покрытый несколькими накладками (2 маркера для начала и цели и один для маршрута).

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

После реализации нити нет обновлений показывают больше, может быть, вы можете помочь мне с коротким взглядом на отрывок из моего кода ниже:

private class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location loc) { 
     posUser = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc 
       .getLongitude() * 1E6)); 

     new Thread(){ 
     public void run(){ 
      mapView.invalidate(); 

      // Erase old overlays 
      mapView.getOverlays().clear(); 

      // Draw updated overlay elements and adjust basic map settings 
      updateText(); 
      if(firstRefresh){ 
       adjustMap(); 
       firstRefresh = false; 
      } 
      getAndPaintRoute(); 
      drawMarkers(); 
     } 
     }; 
    } 

Некоторых особенностей суммированы к способу, как " drawMarkers() "или" updateText() "... (им не нужно больше внимания ;-))

ответ

2

Когда вы действительно просите нить до запустите? Я вижу только код для , создавая. Если бы вы это сделали, вы обнаружили, что только основной (UI) поток разрешен для обновления, как отмечает RPond.

Вместо этого отделите свою работу и post the results back to the main thread via a Handler.

+0

привет, вы правы, я не начал тему * стыд *. Теперь мой маршрут отображается, у меня будут некоторые тесты на производительность ;-) – poeschlorn

+0

Примечание: я думаю, что вы находитесь в неподдерживаемом/неопределенном поведении при обновлении за пределами основного потока пользовательского интерфейса. Образец Handler - ваш друг. –

+0

и как использовать синхронизированный метод для обновления карты? – poeschlorn

0

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

0

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

Я бы ожидать, что это приведет к одному из этих возможностей:

  • ваших изменений метание исключения, которое вы не видите (опять же, возможно, потому что в другом потоке)
  • Ваших изменений игнорируются, потому что они сделаны на неправильной нити.
  • Карта обновляется, но ваш поток пользовательского интерфейса не знает, что нужно перерисовать карту.

Надеюсь, что это поможет - по крайней мере, указав вас смутно в правильном направлении.

0

Можно надеяться, что вы не используете Google MapView для визуализации своей навигации, поскольку с момента моего ознакомления с положениями и условиями навигация не включена в политику приемлемого использования.

Из Android Maps APIs Terms of Service

В соответствии с этим разделом 8, вы не должны (и не может вы разрешать кому-либо):

...

8.7. использовать Сервис или Контент с любыми продуктами, системами или приложениями для или в связи с (а) навигацией в режиме реального времени или руководством по маршруту на основе ввода положения с датчика (включая, но не ограничиваясь ими, любой визуальный или звуковой маршрут по очереди руководство);

...

Смежные вопросы