0

詳細

アプリには、アプリの起動時に実行されるバックグラウンド サービスがあります。このサービスでは、ononStartCommand()は読み取り間に渡されたメートルのパラメーターを使用して GPS 位置のリッスンを開始します。たとえば、50メートルとしましょう。ロケーションが読み取られるたびに、次の操作が発生します。

  • 読み取り場所はローカル データベースに保存されます
  • データベースからすべての未送信の場所を取得する
  • ロケーションは Web サーバーに送信されます
  • 送信が成功した場合、場所はデータベースから削除されます

現在、この動作は場所が読み取られるたびに発生します。ユーザーは歩いている可能性があり、50 メートルまたはドライブを速くするのに時間がかかりますが、多くの読み取りを行うことができ、データベースの挿入/取得で混乱が生じる可能性があります。そのため、主な要求の 1 つは、すべての読み取り位置が読み取られたときに順次処理されるようにすることです。場所 1 を読み取り、挿入し、送信します... 場所 2 を読み取り、挿入し、送信します。

これを行う適切な方法が見つかりません。ご存知のように、サービスはアプリと同じメイン スレッドで実行されるため、UI をスムーズに実行するにはスレッドを使用する必要があります。

ExecutorService と Executors.newSingleThreadExecutor() を使用して、場所が読み取られるたびに新しいスレッドを送信することを考えていました。このようにして、処理が順番に行われることを確認しますが...読み取りごとに新しいスレッドを作成しますが、これはあまり良いことではないかもしれません.

この状況に対してどのような最善のアプローチを提案しますか?

4

1 に答える 1

1

私がすることは、サービスを削除し、場所が読み取られるたびにIntentServiceをスローすることです。

保留中のインテント引数でrequestLocationUpdatesを使用し、インテント サービスをトリガーするインテントで保留中のインテント引数を設定できます。

その後、インテント サービスのonHandleIntentで、場所の更新を処理できます。インテントはインテント サービスによって順次処理され、別のスレッドで処理されます (その後、期限切れになります)。

バックグラウンドでワンショット イベントを使用するだけであれば、インテントサービスはよりコンパクトで適切なソリューションです。

于 2012-11-28T21:39:41.197 に答える