How to improve fragment loading speed?

Just to add to @Xyaren's answer, I needed it to work for SupportFragment which seemed to require some extra steps. Have your activity implement OnMapReadyCallback.

In your 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();

You'll have to implement this:

@Override
public void onMapReady(GoogleMap googleMap) {
    // Do nothing because we only want to pre-load map.
    Timber.d("Map loaded: %s", googleMap);
}

and in your activity layout:

<FrameLayout
    android:id="@+id/dummy_map_view"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:visibility="gone"/>

It needs to go through all the steps including the transaction for Google Play Services to download the map data.


I'm using a very hackish but effective way in my application, but it works good. My mapFragment is not displayed right after the app launches! Otherwise this would not make sense.

Put this in your launcher activity's 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();

This will create a mapview in an background thread (far away from the ui) and with it, initializes all the google play services and map data.

The loaded data is about 5MB extra.

If someone has some ideas for improvements feel free to comment please !


Java 8 Version:

// Fixing Later Map loading Delay
new Thread(() -> {
    try {
        MapView mv = new MapView(getApplicationContext());
        mv.onCreate(null);
        mv.onPause();
        mv.onDestroy();
    }catch (Exception ignored){}
}).start();