1

私のアプリには MapView があり、それに OverlayItems を約 500追加しますが、将来的にはさらに数千になるでしょう...

私の問題は次のとおりです。このアクティビティに切り替えると、3 ~ 4 秒の大規模な停電が発生し、適切に切り替わり、マップをナビゲートしてタップできます。

数か月前、アプリの mapView に 50 ~ 150 のジオポイントしか含まれていなかったとき、ブラックアウトは発生しませんでした。したがって、OverlayItem を mapView に追加すると何か問題があると思います。実際にアプリが遅くなります。

アクティビティの起動時に簡単なサイクルでジオポイントを追加します。

このアクティビティを高速化し、ブラックアウトを防ぐにはどうすればよいですか?

編集:

コメントのおかげで、addOverlay(MyOverlayItem myoverlay)関数呼び出しのたびにpopulate()を呼び出すことに気付きました。

コードを編集しましたが、サイクルの後、次の方法で一度だけ呼び出します。

public void populateNow()
    {

        populate();

    }

しかし、これで素晴らしいヌルポインター例外が発生しました...何かアイデアはありますか?

11-12 15:54:03.398: E/MapActivity(1534): Couldn't get connection factory client
11-12 15:54:03.531: E/AndroidRuntime(1534): FATAL EXCEPTION: main
11-12 15:54:03.531: E/AndroidRuntime(1534): java.lang.NullPointerException
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:211)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.Overlay.draw(Overlay.java:179)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.MapView.onDraw(MapView.java:530)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6933)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6936)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6936)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1904)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.draw(ViewRoot.java:1527)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1263)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.os.Looper.loop(Looper.java:123)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.app.ActivityThread.main(ActivityThread.java:3687)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at java.lang.reflect.Method.invoke(Method.java:507)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at dalvik.system.NativeStart.main(Native Method)
4

4 に答える 4

3

オーバーレイ アイテムをスレッドまたは asynctask にロードして、ロードしたとおりに表示するようにしてください。この方法でブラックアウトを止めることができますが、オーバーレイの表示が遅くなる場合があります。

于 2012-11-12T10:30:09.100 に答える
3

ItemizedOverlay次のことを行うと、ロード時間が大幅に改善される場合があります。

Trick 1:

これが最も重要です。populate()アイテムを 1 つ追加するたびに呼び出しを行っていないことを確認してください。代わりに、すべてのアイテムをロードしpopulate()、すべてのアイテムがロードされた後に 1 回だけ呼び出します。これにより、ロード速度が大幅に向上し、1000 個のアイテムが数ミリ秒でロードされるはずです。

Trick 2: 上記の手順を実行しても読み込みが遅くなる場合は、読み込み対象のアイテム (sqlite、ファイルなど) を取得する場所に遅延が発生している可能性があります。たとえば、sqlite から 1000 個のアイテムをロードするには、DB 構造によっては 3 ~ 4 秒かかる場合があります。これを改善するには、DB 構造を再設計するか、アイテムを DB からロードしてAsyncTask.

よろしく。

于 2012-11-12T11:24:14.823 に答える
1

MapView が処理できるオーバーレイ アイテムの数には制限があります。この制限が何であるかについての公式の言葉はありませんが、しばらくすると、ズーム/パン中の動作が遅くなります。

いくつかの解決策は次のとおりです。

  1. 遅延読み込みを使用した MapviewOVERLay

  2. 表示されているマーカーのみをロードします。これは、ズーム レベルとスパンに基づいて行います。

  3. 99 ポイントの 10 個のオーバーレイは、900 ポイントの 1 個のオーバーレイよりも高速です。

于 2012-11-12T10:36:51.753 に答える
1

公式ガイドから直接: http://developer.android.com/guide/components/processes-and-threads.html

Any slow, blocking operations in an activity should be done in a new thread,
to avoid slowing down the user interface

要素が 50 ~ 150 個しかない場合でも、UI が気付かないほど十分に高速に処理されていましたが、メインの UI スレッドですべての処理を行うことは、すでに悪い考えでした。

ローダーを使用することをお勧めします。これは、適切なバックグラウンド処理を行うための非常に巧妙なシステム管理方法であるためです。http://developer.android.com/guide/components/loaders.html

于 2012-11-12T10:35:45.797 に答える