1

クロス デバイス開発に MvvmCross フレームワークを使用しています。Android エミュレーターでアプリをテストすると (物理デバイスではまだテストできません)、LocationManager で RequestLocationUpdates を呼び出すと、Java.Lang.IllegalArgumentException 例外が発生します。また、それが関連しているかどうかはわかりませんが、ステートメントの上にマウスを置くと、RequestLocationUpdates が「不明なメソッド」であると言われます。これは、例外が発生したかどうかに関係なく発生します。

アプリケーションで2回目に呼び出したときにのみ発生するようですが、使用間でそれをクリアするコードは機能するはずです

    protected override void PlatformSpecificStart(MvxGeoLocationOptions options)
    {
        if (_locationManager != null)
            throw new MvxException("You cannot start the MvxLocation service more than once");

        _locationManager = (LocationManager)Context.GetSystemService(Context.LocationService);
        var criteria = new Criteria() { Accuracy = options.EnableHighAccuracy ? Accuracy.Fine : Accuracy.Coarse };
        var bestProvider = _locationManager.GetBestProvider(criteria, true);

        _locationManager.RequestLocationUpdates(bestProvider, 5000, 2, this);
    }

    protected override void PlatformSpecificStop()
    {
        EnsureStopped();
    }

    private void EnsureStopped()
    {
        if (_locationManager != null)
        {
            _locationManager.RemoveUpdates(this);
            _locationManager = null;
        }
    }

これが含まれるクラスは Java.Lang.Object から継承され、PlatformSpecificStart と Stop が適切なタイミングで呼び出されることを確認しました (つまり、Stop は 2 番目の Start の前に確実に呼び出されます)。誰が何がうまくいかないのか教えてもらえますか?

4

1 に答える 1

1

IMvxGeoLocationWatcher使用されているインターフェイスを示すチュートリアルにレッスンを追加しました。

次のようなコードでhttps://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.Core/ViewModels/Lessons/LocationViewModel.csのサンプルを参照してください。

    private void DoStartStop()
    {
        if (!IsStarted)
        {
            _watcher.Start(new MvxGeoLocationOptions() { EnableHighAccuracy = true }, OnNewLocation, OnError);
        }
        else
        {
            _watcher.Stop();
        }

        IsStarted = !IsStarted;
    }

    private void OnError(MvxLocationError error)
    {
        // TODO - shuold handle the error better than this really!
        LastError = error.Code.ToString();
    }

    private void OnNewLocation(MvxGeoLocation location)
    {
        if (location != null && location.Coordinates != null)
        {
            Lat = location.Coordinates.Latitude;
            Lng = location.Coordinates.Longitude;
        }
    }

これは以下で問題なく動作するようです:

WinRT のコードはまだ書いていません...


エラーの原因の 1 つは、インスタンスを Dispose() しようとした場合ですIMvxGeoLocationWatcher。これを行うと、予期しない結果が生じる可能性があります。

WM6、iPhone、Bada、WP7、および Android で RunSat/Navmi (http://www.navmi.com) で GPS を使用しているときに、ネイティブ プラットフォームが非常に「不安定」/「予測不能」になるという問題に頻繁に遭遇しました。アプリは複数のロケーション リスナーを開始/停止します。これは、機能の設計方法に影響を与えたと思いIMvxGeoLocationWatcherます。一般的に、あなたのアプリが使用する場合IMvxGeoLocationWatcher、インターフェイスを介してアクセスされるある種のシングルトンで場所へのアクセスをラップするのが最善だと思います.ロケーションマネージャーを個別に開始/停止しようとしています。


の機能IMvxGeoLocationWatcherが探しているものではないことがわかった場合は、必ず独自のインターフェイスと独自のプラットフォーム依存の実装を作成してください。これらは、各ネイティブ Setup クラス内に簡単に挿入できます。

たとえば、あなたが試してみたいと思うかもしれないことの1つは、位置情報に利用できるMonoモバイル拡張機能を使用したインターフェースです(連絡先だけでなく、他の機能も増えています)

于 2012-04-25T21:24:45.703 に答える