9

私が間違っている場合は修正してください:

1)サービスは、バックグラウンドで長いタスクを実行するために使用されます。サービスは UI スレッドで実行されるため、長いタスクが発生すると UI がフリーズする可能性があります。サービスは、停止するように指示されている限り、アプリケーションとは無関係に実行され続けます。

2)一方、IntentServiceは、別のスレッドで短いタスクを実行するために使用されます。タスクが完了すると、自動的に終了します。

私がしなければならないこと :

1) 5 秒ごとに場所を確認する

2) 場所に変更がある場合は、それをサーバーに送信し、新しい場所の値で UI を更新します

私を混乱させるもの:

5 秒後に継続して実行する必要があり、UI スレッドが応答しなくなることを望まないので、 ServiceまたはIntentServiceを使用する必要があります。

このアプリは、車両を追跡するために使用されます。

4

6 に答える 6

3

IntentServiceジョブが完了すると自動的に終了し、5 秒後に再度スケジュールする必要があるため、私は使用しません。再スケジュールするにはTimer、アプリケーションに関連付けられた複雑な外部メカニズムが必要になるかContext、さらに悪いことにAlarmManager、バッテリーを狂ったように消費する使用が必要になります。

5 秒ごとTimerにスケジューリングするための内部を持つ Service を使用し、いずれにせよワーカー スレッドで実行されるそれぞれで、位置を取得して Http リクエストを作成します。TimerTasksTimerTask

cancelサービスのメソッドのタイマーを忘れないでください。onDestroyそうしないと、インスタンスがリークしServiceます。

EDIT 私はこれに気づきましたand Update the UI with new location values... を使用し続けますが、 でリクエストを送信Serviceするために を使用してから でブロードキャストメッセージを送信するか、同じメカニズムを使用し続けますが、UI Looper でインスタンス化された を使用して UI 更新リクエストを作成しますそのハンドラで。AsyncTaskdoInBackgroundonPostExecuteTimerTaskHandler

于 2014-02-26T08:36:35.753 に答える
1

IntentServiceを使用してスケジュールできるはずですAlarmManager

私はこのプロジェクトで似たようなことをしました:

https://github.com/madhur/MapMyLocation/tree/develop/src/in/co/madhur/mapmylocation

あなたはそれをチェックアウトすることができます

于 2014-02-26T08:31:14.333 に答える
0

場所について

位置距離の更新があります->つまり、電話の位置がXメートル以上変化した場合は、更新を送信します.5秒ごとに更新しないでください.移動中の車に乗っている場合、Xメートルは速く過ぎます.歩いている場合、5 秒以上 3 ~ 5 メートル以上移動することはありません。アプリがバッテリーを消耗していると人々は文句を言うでしょう。

また、スティッキーで開始した場合、サービスはアプリが実行されていないときにのみ実行を継続します。それ以外の場合、アプリがアプリケーション キューから破棄されると、サービスも破棄されます。

requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent)
Register for location updates using a Criteria and pending intent.
void     requestLocationUpdates(long minTime, float minDistance, Criteria criteria, LocationListener listener, Looper looper)
Register for location updates using a Criteria, and a callback on the specified looper thread.
void     requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
Register for location updates using the named provider, and a pending intent.
void     requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
Register for location updates using the named provider, and a callback on the specified looper thread.
void     requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
Register for location updates using the named provider, and a pending intent.

ロケーション API

于 2014-02-26T08:38:06.063 に答える
0

IntentServiceから派生しServiceてスレッドを作成し、ライフサイクルを管理します。

新しい Android Location StrategiesIntentServiceと組み合わせて使用​​する必要があります。特に、ユーザーの位置を確認している場合は、ジオフェンスを使用して OS に作業を任せることができ、バッテリーを節約できます。

于 2014-02-26T08:31:42.930 に答える