Карта MapFragment загружается с задержкой при возврате из другого действия

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

Чтобы проиллюстрировать проблему, я сделал следующее:

  1. Я немного изменил одно из действий в примерах Google Maps Android API. Он открывает пустое действие через элемент действия. Когда я нажимаю кнопку «Назад», карта загружается, но только после завершения перехода.
  2. Я немного преувеличил эффект перехода, чтобы вы могли лучше видеть проблему. Я установил скорость анимации перехода в Параметры разработчика на 5x. Однако даже на скорости 1x это отставание вызывает беспокойство.

Посмотрите это видео: http://www.youtube.com/watch?v=12SEotktlXI.

Есть ли у вас какие-либо предложения, чтобы предотвратить это отставание? Почему все представления загружаются сразу, а сама карта — нет?

Среда тестирования: Nexus 5, Android 4.4.2, без рута

Изменить. Эта проблема также возникает при использовании MapView вместо MapFragment.


comment
Пробовали протестировать на других устройствах? Я заметил это только на Nexus 5. Galaxy S3 показал другое поведение...   -  person Emil Adz    schedule 17.02.2014
comment
Определенно да. Пробовал на HTC Desire SV, лагов не было. Я думаю, это потому, что они не используют анимацию перехода. Когда я отключаю анимацию перехода на своем Nexus 5 (настройки > параметры разработчика > анимация перехода), задержка также исчезает.   -  person ercan    schedule 17.02.2014
comment
Так что это что-то связанное с KitKat... может баг.   -  person Emil Adz    schedule 17.02.2014
comment
Я думаю, что это ошибка API карт, потому что все остальные представления загружаются сразу, но только карта не...   -  person ercan    schedule 17.02.2014


Ответы (1)


Причина: это связано с тем, что как только будут показаны ваши настройки активности, активность карты будет находиться в состоянии onpause(); таким образом, я предполагаю, что управление Android восстановило память из активности карты.

Решение: создайте статический класс и объявите, что ваша карта статическая, чтобы Android не восстанавливал память, используемую вашей картой.

Ex.

//your static class
public class MapData{
  public static GoogleMap map;
}

//your map activity
public class MapActivity extends Activity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(MapData.map != null)
       MapData.map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
  }
}
person Rick Royd Aban    schedule 26.02.2014
comment
По крайней мере, убедитесь, что onDestroy static var очищен. - person neteinstein; 26.02.2014
comment
Извините, но это не сработало. Я заменил каждое вхождение mMap в примере RetainMapDemoActivity на MapData.map, но карта все еще имеет отставание, когда я возвращаюсь из фиктивной активности... :( - person ercan; 26.02.2014