2012-04-25 5 views
1

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

それだけで私は自分のアプリケーションでそれを呼び出す二度目を発生するようですが、それは

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から継承しているクラスを動作するはずのような使用の間にそれをクリアコードが見えます。 Objectと私は、PlatformSpecificStartとStopが適切な時に呼び出されたことを確認しました(つまり、Stopは確実に2番目のStartの前に呼び出されます)。誰かが間違っていることを教えてもらえますか?

+0

私がしました厳密に見てみると、例外は "this"がnullであることが判明しました!どのように起こることができますか? –

+0

どこにでも投稿できるサンプルがありますか? – Stuart

+1

こんにちはスチュアート - 私はちょうど質問に答えようとしましたが、私はそのようなノブなので、私をさせません!私は許可されると数時間後にそれをすることができます。 –

答えて

1

IMvxGeoLocationWatcherインターフェイスが使用されていることを示すチュートリアルのレッスンを追加しました。 https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.UI.WindowsPhone/Views/Lessons/LocationView.xaml

  • ドロイド - - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.UI.Droid/Views/Lessons/LocationView.cs
  • タッチ - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.UI.Touch/VIews/Lessons/LocationView.cs
    • WP7:これは上でOK動作するようです

      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; 
           } 
          } 
      

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

    私はまだWinRTのためのコードを書いていない...あなたが(廃棄しようとすると、あなたのエラーを引き起こしている可能性がありますがあり


    一つのこと)IMvxGeoLocationWatcherインスタンス - これを行うには、予測できない結果につながる可能性があります。

    RunSat/Navmi(http://www.navmi.com)用のWM6、iPhone、Bada、WP7、AndroidでGPSを扱うとき、私は頻繁にネイティブプラットフォームがかなり不安定になる可能性のある問題に遭遇しました/アプリが複数の位置リスナーを開始/停止するときに「予測できない」 - これは私がIMvxGeoLocationWatcher機能を設計した方法に影響を与えたと思います。一般的には、あなたのアプリがIMvxGeoLocationWatcherを使用している場合は、インターフェイス経由でアクセスされる何らかのシングルトンの場所へのアクセスをラップすることをお勧めします。これを行うと、複数のクライアントを持たずに場所の機能を簡単に制御できます。すべて個別に位置管理を開始/停止しようとしています。


    あなたがIMvxGeoLocationWatcherの機能は、あなたが探しているものではありません見つけた場合は、その後、すべての手段によって、独自のインターフェイスと独自のプラットフォーム依存の実装を作成する - 彼らは簡単に各ネイティブセットアップクラス内に注入することができます。

    たとえば、あなたが試してみたいかもしれない一つのことは、場所のために利用可能なモノラルモバイルの拡張機能を使用して、インターフェイスである(だけでなく、コンタクトのために、いくつかのために、あまりにも他の機能が増えている)

    +0

    こんにちはスチュアート、もう一度包括的な答えをありがとう。あなたの推測は確かに正しかった - 私はウォッチャーにDispose()を呼んでいた。私のウォッチャーのインスタンスはGetServiceを呼び出すことによって取得され、毎回同じインスタンスを取得していたことを認識していません。その作業は今では絶対にうまくいきます:) –

    +0

    ウォッチャーを使い捨てにするには1行の変更ですが、ウォッチャーを作成/処分すると問題が発生しました。これについて考える必要があります。ウォッチャーインターフェイスへの「シングルトン」命名規則少なくとも、IDisposableインターフェイスを削除する必要があるかもしれません。 – Stuart

    関連する問題