Intereting Posts
Как разрешить взаимодействие NFC с устройствами, которые работают с одним и тем же приложением / активностью События неравномерного каротажа не всегда Как создать 100% пользовательский DialogFragment Как показывать предложения, прежде чем пользователь начнет вводить поиск? Обнаруживать программно, если блокировка системы может быть отключена или нет в Android? Изображение пользователя в Instagram InApp, приобретенный в Android Сбой приложения при загрузке собственной библиотеки для webRTC SecurityException: разрешение отклонено (отсутствует разрешение INTERNET?) Модуль Memory Analyzer (MAT) не открывает кучу prof в MAT Eclipse 4.1.2 автоматически Как определить, когда устройство ориентировано вверх дном в libGDX Генерировать запутанную JAR для распределения кода Удаление символов из sparable CharSequence Элемент Simple List Checked проверяет несколько элементов на клике Можно ли использовать GCM для отправки push-уведомлений между различными приложениями?

Ускорьте запуск активности, содержащей mapview, и расширьте MapviewActivity

У меня есть приложение, которое содержит активность, которая является MapviewActivity и в основном является mapview. Однако я заметил, что время запуска активности очень медленное и вызывает задержку с момента нажатия кнопки, чтобы войти в активность карты. Я чувствую, что это создает плохой пользовательский опыт и хотелось бы избежать этого. Я уже установил фон активности карты на @null как было предложено одной из статей улучшения пользовательского интерфейса на странице разработчика googles, что, по моему мнению, не делает этого.

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

Спасибо, Джейсон

Вы можете попробовать удалить MapView из своего макета. Затем в onCreate() используйте post() чтобы запланировать Runnable для добавления в MapView и выполнить инициализацию, связанную с картой, с Java. Используя post() (или, потенциально, postDelayed() ), чтобы отложить MapView дальше, вы должны сначала перенести остальную деятельность.

Я не пробовал это, поэтому YMMV. 🙂

Я попробовал ответ CommonsWare, но значительно задержка запустила даже голый MapActivity без MapView.

Итак, я добавил еще одну активность в середине, «MapLoading». Моя домашняя деятельность запускает MapLoading, которая затем использует post () для немедленного запуска MapActivity. Из-за задержки приложение прилипает к MapLoading в течение нескольких секунд (что является предполагаемым результатом, а не прилипает к моей домашней деятельности).

В действии MapLoading нет setHistory, поэтому, когда нажата кнопка back от MapActivity, она переходит прямо на главный экран. Будущие запуски MapActivity очень быстрые, и активность MapLoading просто мигает на экране.

Вот код для MapLoading (активность с MapView в нем называется Map):

 public class MapLoading extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.maploading); new Handler().post(new Runnable() { public void run() { startActivity(new Intent(MapLoading.this, Map.class)); } }); } } 

Вот его макет:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/maploading" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:textSize="14pt" android:text="Loading map..." /> </RelativeLayout> 

И соответствующая строфа в AndroidManifest.xml:

 <activity android:label="@string/app_name" android:name="MapLoading" android:noHistory="true" /> 

Меня это раздражало какое-то время, и я отработал это, добавив ответ CommonsWare :

В настоящее время я использую это решение, которое значительно ускорило время загрузки Activity и сделало все таким же гладким, как и оно.

Моя карта:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); // See activity_map.xml below. // Start a runnable that does the entire Map setup. // A delay does not seem to be necessary. Handler mapSetupHandler = new Handler(); Runnable mapSetupRunnable = new Runnable() { public void run() { FragmentManager fragMan = getSupportFragmentManager(); FragmentTransaction fragTransaction = fragMan.beginTransaction(); final SupportMapFragment mapFragment = new SupportMapFragment(); fragTransaction.add(R.id.container_map, mapFragment, "mapFragment"); fragTransaction.commit(); // At the end, retrieve the GoogleMap object and the View for further setup, // zoom in on a region, add markers etc. mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMapView = mapFragment.getView(); setUpMap(); } }); } }; mapSetupHandler.post(mapSetupRunnable); } 

макет / activity_map.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!--This FrameLayout will be used by the GoogleMap--> <!--as a container for the SupportMapFragment.--> <FrameLayout android:id="@+id/container_map" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_above="@id/bar_room_password" android:layout_below="@id/toolbar"> <!--Initially the container is filled with a placeholder image.--> <!--A small, heavily blurred image of a map screenshot is used--> <!--in order to fake a loading map.--> <ImageView android:id="@+id/image_map_placeholder" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="50" android:contentDescription="@string/map" android:scaleType="centerCrop" android:src="@drawable/placeholder_map" /> </FrameLayout> [... more, unrelated Views...] </RelativeLayout> 

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

Логотип Google размещается поверх ImageView относительно рано, поэтому он выглядит довольно убедительно с использованием только изображения размером 128×128 пикселей:

ImageView под GoogleMap в действии как макет загрузочного экрана