1

コンパスと、地図上の自分の位置と別の位置の間の距離を表示しようとしています。

ほぼ同じように:

Android: リストビューでのコンパス + 距離

コードを理解し、向きの変化を検出するためのリスナーを設定し、距離も計算しました。

さらに、ListView に正しい距離を表示しています (既にカスタム アダプターを使用しています)。それは私がどこにいるかについての少しの説明です。

これは私の問題です:アダプターが見て呼び出している実際のリストの値を変更することにより、リスナーを介してListViewを毎秒更新しています:

    notifyDataSetChanged();

これを毎秒呼び出すと、予想どおり、ListView が遅延します。約 10 秒ごと (またはそれ以上) に距離を更新することで問題を解決できます。ただし、ライブ コンパスを使用するには、リストをはるかに頻繁に更新する必要があります。私は周りを見回していましたが、実際には何も見つかりませんでした.私が得ることができるすべての助けに感謝します. ありがとうございました!

補足: 私が書いたコードが必要な場合は、ここに貼り付けます。パーツが多いので、ご要望に応じて製作いたします。

4

1 に答える 1

1

私見では、リストビューとアダプタ全体を省略する必要があります。最善のアプローチは、頻繁に更新する必要がある要素に対して独自のビューを作成することです。

たとえば、setAbsouluteheadingを持つHeadingViewというビューを作成します。このセッターはアダプターによって使用されます。次に、viewはSensorEventListenerも実装して、センサーを監視し、デバイスの見出しを取得します。相対方向を変更する必要がある場合、HeadingViewはそれを自動的に更新します。この場合の問題は、HeadingViewがセンサーイベントに対して自身を登録/登録解除する必要がある場合の検出です。onWindowFocusChangedは有望に見え、onWindowSystemUiVisibilityChanged(APIレベル16)が必要です。

いくつかのコーナーケースが発生する可能性があり、必要なときにビューがセンサーの監視から登録解除されないという危険性があることを忘れないでください。これにより、スリープモードでの消費電力がひどくなる可能性があるため、徹底的なテストを行うことを忘れないでください。

このHeadingViewとセンサーの間の通信を実行する別の方法がおそらくありますが、一般的に私の概念は良い解決策だと思います。


アップデート:

センサーを無効にしたときの検出に問題がなく、メモリリークが発生しないように、このHeadingViewと通信する方法についてより良いアイデアを思いつきました。答えは、週の参照、より正確にはWeakHashMapです。

HeadingViewビューは、前に説明したように多かれ少なかれですが、コンストラクターでは、YourActivityにその存在を通知します。したがって、次のようになります。

public class HeadingView extends View {

    public HeadingView(Context context) {
        super(context);

        YourActivity activity = (YourActivity) context;
        activity.addWeekSensorObserver(this);
    }
}

そしてあなたの活動:

public class YourActivity extends Activity implements SensorEventListener {
    // there is no WeekSet and WeakHashMap is more handy then List<WeakReference>
    private final  WeakHashMap<HeadingView, Object> sensorObservers = new WeakHashMap<HeadingView, Object>();
    public void addWeekSensorObserver(HeadingView headingView) {
        sensorObservers.put(headingView, null);
    }

    private updateHeadings(float[] deviceHeading) {
        Set<HeadingView> keySet = sensorObservers.keySet();
        for (HeadingView headingView : keySet) {
            headingView.setDeviceHeading(deviceHeading);
        }
    }
}

アクティビティ中の標準センサー処理が適用されるようになったため、センサーを無効にするタイミングの検出は問題にならず、メモリリークについて心配する必要はありません。コードをあまり変更する必要はないと思います:)。それをより良くするために、あなたはインターフェースを定義することができます。

于 2012-07-12T14:29:47.730 に答える