что замедляет загрузку фрагментов моей карты?
Повышение Производительности:
Ранее я сохранял все изображения в папке drawable
, это может быть причиной того, что карта сначала загружается медленно, когда рисуют маркеры на экране, изображение может не соответствовать размеру экрана. Теперь я сохранял изображения в drawable-mdpi
, drawable-hdpi
и так далее, приложение работает более гладко, чем раньше. Надеюсь, это поможет
Первоначальный Вопрос:
Я создал карту во фрагменте, исходный код можно найти ниже.
Фрагмент карты вяло, когда первый раз загружается. Если я иду на любой другой фрагмент и снова нажимаю на фрагмент карты, он загружается быстро и больше не слагается.
Может ли кто-нибудь сказать мне, что здесь происходит? Спасибо!Fragment_map.xml, id - map
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
MyMapFragment.java (содержит onCreateView
и setUpMapIfNeeded
)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
try {
rootView = inflater.inflate(R.layout.fragment_map, container, false);
} catch (InflateException e) {
/* map is already there, just return view as it is */
Log.e(TAG, "inflateException");
}
setUpMapIfNeeded();
return rootView;
}
public void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the fragment_map.
if (myMap == null) {
// Try to obtain the fragment_map from the SupportMapFragment.
myMap = ((SupportMapFragment) MainActivity.fragmentManager.findFragmentById(R.id.map)).getMap();
// Check if we were successful in obtaining the fragment_map.
if (myMap != null) {
setUpMap();
}
}
}
5 ответов:
Я использую очень хаковатый, но эффективный способ в своем приложении, но он хорошо работает. Мой фрагмент карты не отображается сразу после запуска приложения! Иначе это не имело бы смысла.
Поместите это в вашу пусковую активность onCreate:
// Fixing Later Map loading Delay new Thread(new Runnable() { @Override public void run() { try { MapView mv = new MapView(getApplicationContext()); mv.onCreate(null); mv.onPause(); mv.onDestroy(); }catch (Exception ignored){ } } }).start();
Это создаст mapview в фоновом потоке (далеко от пользовательского интерфейса) и с его помощью инициализирует все сервисы google play и картографические данные.
Загруженные данные составляют около 5 Мб дополнительно.
Если у кого-то есть какие-то идеи для улучшения не стесняйтесь комментировать, пожалуйста !
Java 8 Версия:
// Fixing Later Map loading Delay new Thread(() -> { try { MapView mv = new MapView(getApplicationContext()); mv.onCreate(null); mv.onPause(); mv.onDestroy(); }catch (Exception ignored){} }).start();
Просто чтобы добавить к ответу @Xyaren, мне нужно было, чтобы он работал для SupportFragment, который, казалось, требовал некоторых дополнительных шагов. Пусть ваша активность реализует OnMapReadyCallback.
В вашем onCreate:
new Thread(() -> { try { SupportMapFragment mf = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction() .add(R.id.dummy_map_view, mf) .commit(); runOnUiThread(() -> mf.getMapAsync(SplashActivity.this)); }catch (Exception ignored){ Timber.w("Dummy map load exception: %s", ignored); } }).start();
Вам придется реализовать следующее:
@Override public void onMapReady(GoogleMap googleMap) { // Do nothing because we only want to pre-load map. Timber.d("Map loaded: %s", googleMap); }
И в вашей схеме действий:
Он должен пройти все этапы, включая транзакцию для сервисов Google Play, чтобы загрузить данные карты.<FrameLayout android:id="@+id/dummy_map_view" android:layout_width="match_parent" android:layout_height="0dp" android:visibility="gone"/>
Я тоже часто сталкивался с этой проблемой... Оказалось, что самым большим виновником был сеанс отладки, прикрепленный к процессу моего приложения. Карты в моем приложении работали намного быстрее и плавнее, когда я отключал отладчик или просто отсоединял кабель USB.
Проверьте мой связанный пост здесь: Первый запуск активности с Google Maps очень медленный
[отредактировано]
Методы
getMap()
иsetUpMap()
, вероятно, очень медленные. Их обработка должна выполняться вAsyncTask
так, чтобыonCreateView()
мог быстро возвращаться каждый раз.Дополнительная информация:
onCreateView()
вызывается в потоке пользовательского интерфейса, поэтому любая медленная обработка, которую он выполняет, замораживает пользовательский интерфейс. ВашAsyncTask
должен выполнить всю медленную обработку в своем методеdoInBackground()
, а затем обновить пользовательский интерфейс в своем методеonPostExecute()
. Смотрите AsyncTask JavaDoc для получения более подробной информации.
Вы можете попробовать это
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mapActivity); getSreenDimanstions(); fragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)); map = fragment.getMap();
}
Этот класс расширял деятельность