Что замедляет загрузку фрагмента карты?
Повышение производительности:
Раньше я сохранял ВСЕ изображения в папке 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();
}
}
}
Ответы
Ответ 1
Я использую очень хакерский, но эффективный способ в своем приложении, но он работает хорошо.
Мой mapFragment не отображается сразу после запуска приложения! В противном случае это не имеет смысла.
Поместите это в свою активность запуска 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();
Это создаст карту в фоновом потоке (далеко от ui) и с ней, инициализирует все сервисы воспроизведения google и данные карты.
Загруженные данные составляют около 5 МБ.
Если у кого-то есть некоторые идеи для улучшения, не стесняйтесь комментировать, пожалуйста!
Версия Java:
// Fixing Later Map loading Delay
new Thread(() -> {
try {
MapView mv = new MapView(getApplicationContext());
mv.onCreate(null);
mv.onPause();
mv.onDestroy();
}catch (Exception ignored){}
}).start();
Ответ 2
Просто чтобы добавить к ответу @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);
}
и в вашем макете действий:
<FrameLayout
android:id="@+id/dummy_map_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="gone"/>
Для загрузки данных карты необходимо выполнить все шаги, включая транзакцию Служб Google Play.
Ответ 3
Я тоже сталкивался с этой проблемой... Оказывается, самый крупный виновник имел сеанс отладки, подключенный к моему приложению. Карты в моем приложении выполнялись намного быстрее и плавно, когда я отключил отладчик или просто отключил USB-кабель.
Посмотрите мой связанный пост здесь: Первый запуск Activity с Google Maps очень медленный
Ответ 4
[Изменено]
Методы getMap()
и setUpMap()
, вероятно, очень медленные. Их обработка должна выполняться в AsyncTask
, чтобы onCreateView()
мог быстро возвращаться каждый раз.
Дополнительная информация: onCreateView()
вызывается в потоке пользовательского интерфейса, поэтому любая медленная обработка, которую он делает, заморозит пользовательский интерфейс. Ваш AsyncTask
должен выполнить всю медленную обработку в своем методе doInBackground()
, а затем обновить интерфейс в своем методе onPostExecute()
. Подробнее см. AsyncTask JavaDoc.
Ответ 5
Вы можете попробовать это
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapActivity);
getSreenDimanstions();
fragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
map = fragment.getMap();
}
Этот класс расширил Activity