1

ナビゲーションアプリをより高速で安定させる方法について質問があります。

私のアプリの基本的なレイヤーは、いくつかのオーバーレイ(開始と目的地用に2つのマーカー、ルート用に1つ)で覆われた単純なマップビューです。

私の考えは、ルートを表示するスレッドを実装して、より複雑なルートの計算中にアプリがハングアップしないようにすることです(現在のように)。

スレッドを実装した後、更新は表示されなくなりました。以下のコードの抜粋を一目で確認できるかもしれません。

    private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location loc) {
        posUser = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc
                .getLongitude() * 1E6));

        new Thread(){
        public void run(){
            mapView.invalidate();

            // Erase old overlays
            mapView.getOverlays().clear();

            // Draw updated overlay elements and adjust basic map settings
            updateText();
            if(firstRefresh){
                adjustMap();
                firstRefresh = false;
            }
            getAndPaintRoute();
            drawMarkers();
        }
        };
    }

一部の機能は、「drawMarkers()」や「updateText()」などのメソッドにまとめられています...(これ以上注意する必要はありません;-))

4

4 に答える 4

2

スレッドの実行を実際に要求するのはいつですか。作成するためのコードしか表示されません。そうした場合、RPondが指摘しているように、メイン(UI)スレッドのみが更新を許可されていることに気付くでしょう。

代わりに、作業を分割し、ハンドラーを介して結果をメインスレッドにポストバックします。

于 2010-06-15T13:12:51.320 に答える
0

UIはUIスレッドでしか更新できないので、それが問題だと思います。この問題の解決策については、スレッドに関するこの記事を確認してください。

于 2010-06-15T13:10:32.080 に答える
0

ここで間違ったツリーを吠えているかもしれませんが、UIスレッドではないスレッドでMapViewに変更を加えているという事実と関係があると思います。

これにより、次のいずれかの可能性が生じると思います。

  • あなたの変更はあなたが見ていない例外を投げています(これもおそらく別のスレッドにあるためです)
  • 間違ったスレッドで行われているため、変更は無視されます。
  • マップは更新されていますが、UIスレッドはマップを再描画する必要があることを認識していません。

これがお役に立てば幸いです-少なくとも漠然と正しい方向にあなたを向けることによって。

于 2010-06-15T13:11:44.613 に答える
0

利用規約を読んだところ、ナビゲーションは利用規定に含まれていないため、ナビゲーションのレンダリングにGoogleMapViewを使用していないことを願っています。

AndroidMapsAPIの利用規約から

このセクション8では、次のことを行ってはなりません(また、他の人に許可することもできません)。

..。

8.7。(a)センサーからの位置入力に基づくリアルタイムナビゲーションまたはルートガイダンス(視覚的または聴覚的なターンバイターンルートを含むがこれに限定されない)のために、またはそれに関連して、製品、システム、またはアプリケーションでサービスまたはコンテンツを使用するガイダンス);

..。

于 2011-01-14T23:02:16.033 に答える