0

OK Android の GPS について質問があります。数日かけて、20 秒ごとに場所 (経度、緯度) を検出し、この情報をサーバーに送信するコードを作成しようとしました。しかし、この質問はデータの送信に関するものではありません。

いくつかのアイデアとアドバイスがありました。ループでピックアップ座標を作成する方法の束またはチュートリアルを読みました。

  1. activity、使用LocationListener
  2. IntentService

BUT: を使用すると、メソッドでLocationListener座標を取得できるのは事実ですonLocationChanged()。問題は、それが であることですActivity。そのため、画面がオフになったり、誰かが呼び出したりすると、座標の収集が停止すると思います。

IntentServiceandを使用するとlocationManager.getLastKnownLocation(provider)、独自のスレッドで実行されるため、これは優れているように見えますが、ループ (間隔で座標を選択する必要があるため、そこにある必要があります) では、このコードは機能しません。

      lat = location.getLatitude();
      lon = location.getLongitude();

それは最初にのみ機能し、その後、座標は同じままです(再宣言も試みLocationManagerましたが、何も変わりませんでした)。座標の取得は不必要に複雑に思えます。

私の質問は次のとおりです。ご協力いただきありがとうございます。すべての有益なアドバイスに感謝します。

4

2 に答える 2

2

IntentService の代わりにServiceを使用することをお勧めします。onHandleIntent()IntentServices は、コールバックがまだデータを返しているかどうかに関係なく、 のコードを終了した直後に終了します。また、繰り返しポーリングするループを作成することgetLastKnownLocation()は、別のスレッドであっても、場所の更新を取得するための非常に非効率的な方法です。より良いアプローチは、LocationListenerをに渡しrequestLocationUpdates()、CPU をブロッキング ループのビジーワークから解放することです。

デフォルトでは、サービスは独自のスレッドで実行されないことに注意してください。これは自分で行う必要があります。正しく機能するにはルーパーが必要なので、 HandlerThreadを使用することをお勧めします。requestLocationUpdates()


IntentServiceのドキュメントから:

IntentService は、オンデマンドで非同期要求 (インテントとして表現) を処理するサービスの基本クラスです。クライアントは startService(Intent) 呼び出しを介してリクエストを送信します。サービスは必要に応じて開始され、ワー​​カー スレッドを使用して各インテントを順番に処理し、作業がなくなると停止します。

Serviceのドキュメントから:

Service クラスに関するほとんどの混乱は、実際にはそれがそうでないものに関係しています。

  • サービスは個別のプロセスではありません。Service オブジェクト自体は、それが独自のプロセスで実行されていることを意味しません。特に指定がない限り、アプリケーションと同じプロセスで実行されます。
  • サービスはスレッドではありません。それ自体は、メイン スレッドから離れて作業を行う手段ではありません (アプリケーションが応答しないエラーを回避するため)。
于 2013-03-01T18:07:09.387 に答える
0

何を言っているのかよくわからないと思います。私が知る限り、Location StrategiesのドキュメントもLocationListenerのドキュメントも、それをアクティビティとして実装する必要があることについて何も述べていません。そして、私が理解している限り (実際に使用したこともあります)、LocationListener は非同期です。場所に関する新しい情報を時々提供します。どう使うかはあなた次第です。

私がすることは、サービスの開始時に LocationListener を作成し、その情報が変更されたかどうかを定期的に確認することです。私がリンクした最初のドキュメントは、それを使用する方法をかなりよく説明しています。

于 2013-03-01T18:06:24.780 に答える