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


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

Ранее я сохранял все изображения в папке 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 24

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);
}

И в вашей схеме действий:

<FrameLayout
    android:id="@+id/dummy_map_view"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:visibility="gone"/>
Он должен пройти все этапы, включая транзакцию для сервисов Google Play, чтобы загрузить данные карты.

Я тоже часто сталкивался с этой проблемой... Оказалось, что самым большим виновником был сеанс отладки, прикрепленный к процессу моего приложения. Карты в моем приложении работали намного быстрее и плавнее, когда я отключал отладчик или просто отсоединял кабель 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();    

}

Этот класс расширял деятельность