web-dev-qa-db-ja.com

マップフラグメントの読み込みが遅くなる原因は何ですか?

パフォーマンスの向上:

以前に[〜#〜] all [〜#〜]画像をdrawableフォルダーに保存しました。これが、画面にマーカーを描画するときにマップの読み込みが遅くなる理由です。画像が画面サイズに合わない場合があります。 現在画像をdrawable-mdpidrawable-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();
            }
        }
    }
29
Haifeng Zhang

私はアプリケーションで非常にハック的ですが効果的な方法を使用していますが、それはうまく機能します。アプリの起動直後に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 Playサービスとマップデータが初期化されます。

ロードされたデータは約5MB余分です。

誰かが改善のためのアイデアをお持ちの場合は、コメントしてください。


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();
43
Xyaren

@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開発者サービスのトランザクションを含むすべての手順を実行する必要があります。

6
Conti

私もこの問題に何度も遭遇していました...最大の犯人は、アプリのプロセスにデバッグセッションをアタッチしていたことです。デバッガーを切断するか、USBケーブルを抜くだけで、アプリ内のマップははるかに高速かつスムーズに実行されました。

こちらの関連​​記事をご覧ください: Googleマップでのアクティビティの最初の起動は非常に遅いです

3
Wookie

[編集済み]

getMap()およびsetUpMap()メソッドはおそらく非常に遅いです。 onCreateView()が毎回迅速に戻ることができるように、それらの処理はAsyncTaskで実行する必要があります。

詳細:onCreateView()はUIスレッドで呼び出されるため、処理が遅くなるとUIがフリーズします。 AsyncTaskは、doInBackground()メソッドですべての低速処理を実行し、onPostExecute()メソッドでUIを更新する必要があります。詳細については、 AsyncTask JavaDoc を参照してください。

0
cybersam