Подтвердить что ты не робот

Что замедляет загрузку фрагмента карты?

Повышение производительности:

Раньше я сохранял ВСЕ изображения в папке 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();
            }
        }
    }
4b9b3361

Ответ 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