2

着信 SMS をリッスンし、特定の方法で処理する Android アプリを設計しています。メッセージを受信して​​インテント サービスに送信するブロードキャスト レシーバーがあります。

Intent serviceIntent = new Intent(context, SMSIntentService.class);
serviceIntent.putExtras(intent.getExtras());
context.startService(serviceIntent);

インテント サービスの目的は、SMS を自分の DB に保存し、そのメッセージを HTTP POST 経由でサーバーに送信し、結果を評価してアプリの DB を更新し、最終的に送信者に返信することです。これまでのところすべて問題ありませんが、大量の SMS が同時に到着する可能性があるため、サーバーとの通信を切り離して別のスレッドに入れたいと考えています。

だから私がこれまでにやっていることはこれです:

SmsDto sms = smsDataSource.saveSms(new SmsDto(originator, body, timestamp));

SMSProcessingTask task = new SMSProcessingTask(this.getApplicationContext(), sms);
Thread t = new Thread(task);
t.start();

これまでのところは順調ですが、大量のメッセージを扱うこの実装は信頼できません。

だから、私の質問は:

インテント サービスでは、ThreadPoolExecutor を使用することをお勧めしますか? 私はこのようなものになります:

//in IntentService's onCreate
this.executor = Executors.newCachedThreadPool();

//in onHandleIntent()
executor.execute(task);

一定期間メッセージが受信されず、IntentService が停止するとどうなりますか。それによって作成されたスレッドは引き続き実行されますか?

このアプローチが、私が達成しようとしていることに対処するための最良の方法であるかどうかはわかりません。

ありがとう

アップデート:

  • このアプリには UI アクティビティはまったくありません。
  • サーバーとの通信にはかなりの時間がかかる可能性があるため、メッセージの処理時間を最小限に抑えたいと考えています。これにより、キュー内の次の SMS がすぐに取得され、処理が開始されます。

4

2 に答える 2

0

いいえ、使用しないでください。主な理由は、SQlite アクセスがスレッド セーフではないため、複数のスレッドが同時にデータベースに書き込みをしたくないためです。また、タスクがたまたま UI を更新した場合、そのようには機能しません。

なぜこれらのタスクがあるのか​​ 本当にわかりません.IntentServiceはすでにUIスレッドからメッセージを処理しています.

于 2012-08-23T15:40:37.823 に答える