setContentView() медленный с фрагментом карты

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

Вот мой onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "onCreate Start -------------------------------");
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate 1 -------------------------------");
    setContentView(R.layout.activity_main);
    Log.i(TAG, "onCreate 2 -------------------------------");
    do_async_setup();
    Log.i(TAG, "onCreate 3 -------------------------------");
    prefs = getSharedPreferences(PREFS_NAME, 0);
    prefs_editor = prefs.edit();
    Log.i(TAG, "onCreate Finish -------------------------------"); 

А вот и выход.

01-20 10:05:28.802: I/HeadsUp(19544): onCreate Start -------------------------------
01-20 10:05:28.802: I/HeadsUp(19544): onCreate 1 -------------------------------
01-20 10:05:30.396: I/HeadsUp(19544): onCreate 2 -------------------------------
01-20 10:05:30.396: I/HeadsUp(19544): onCreate 3 -------------------------------
01-20 10:05:30.403: I/HeadsUp(19544): onCreate Finish -------------------------------

Вы можете увидеть 1,5-секундную задержку для setContentView. Вот мой макет.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"/>

</RelativeLayout>

Это просто выглядит плохо, как будто приложение зависло при загрузке. Как я могу ускорить это или скрыть задержку?

Благодарность,


person Rob    schedule 19.01.2013    source источник
comment
Используйте Traceview, чтобы выяснить, в чем именно заключается ваша проблема.   -  person CommonsWare    schedule 20.01.2013
comment
@CommonsWare, если я правильно читаю, это говорит мне о том, что мне сказали журналы. setContentView использует примерно 44% «времени» для метода onCreate. Incl Real Time говорит 3211.060, что, как я полагаю, составляет миллисекунды? Кроме того, это ActionBarSherlockNative.setContentView() может быть поэтому так медленно загружается xml и т. д.? Проходя через самые длинные дочерние методы, я получаю LayoutInflater.createViewFromTag и еще несколько шагов SupportMapFragment.onCreateView() все еще в 1998 мс, а затем в еще один код Google GMS. Так это выглядит как фрагмент карты Google. это кажется правильным?   -  person Rob    schedule 20.01.2013
comment
Что ж, наиболее вероятным виновником будет карта, так что, думаю, это неудивительно. При этом это также предполагает, что вы, возможно, просто застряли. На каком оборудовании вы это запускаете?   -  person CommonsWare    schedule 20.01.2013
comment
@CommonsWare Он работает на телефоне Galaxy Nexus. Я думаю, вы правы. Аналогичная задержка возникает с приложением Goggles Map на том же устройстве. Я пытался скрыть его диалоговым окном-заставкой, но оно не отображается до тех пор, пока не будет задержки, так что это бессмысленно, и мне в любом случае не нужен экран-заставка. Также это быстрее, когда не отлаживает.   -  person Rob    schedule 20.01.2013
comment
@CommonsWare: я не уверен. Но возможно ли это из-за скорости интернет-соединения?   -  person Shreyash Mahajan    schedule 21.01.2013
comment
Вероятно, содержимое карты было ранее кэшировано. Если это новый запуск без кеша и сетевого подключения, карта будет оставаться пустой до тех пор, пока не будет установлено подключение (когда она сможет изменить содержимое карты). Я думаю, что мой ответ, скорее всего, является объяснением вопроса.   -  person qubz    schedule 21.01.2013
comment
Я заметил, что в окончательной (без отладки) сборке задержка намного меньше: может быть, ~ 200 мс против 2000 мс+ в отладке. Это приемлемо (просто). Но было бы неплохо устранить это, возможно, есть способ предварительно создать действие в фоновом режиме или, по крайней мере, заранее полностью инициализировать MapFragment/GLSurfaceView?   -  person Jarrod Smith    schedule 29.10.2014
comment
@JarrodSmith Вы когда-нибудь находили способ? Моя задержка почти 2000ms даже в non-debug.   -  person theblang    schedule 17.11.2014
comment
@mattblang Нет, я не очень глубоко исследовал идею создания экземпляра, но мне показалось, что это поможет, только если вы пройдете полный цикл транзакции фрагмента / setContentView ().   -  person Jarrod Smith    schedule 18.11.2014


Ответы (2)


Это недостаток использования GLSurfaceView, такого как новые карты v2 в Android. Задержка вызвана инициализацией GLSurfaceView. См. здесь http://code.google.com/p/gmaps-api-issues/issues/detail?id=4639 для краткого объяснения рядом с постом № 5 от сотрудника Google и фрагмента, помогающего решить эту проблему (немного). Пометьте проблему звездочкой, чтобы повысить ее приоритет.

person qubz    schedule 20.01.2013
comment
Спасибо, это подтверждает это для меня. - person Rob; 21.01.2013

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

person Wookie    schedule 22.12.2014