-1

ハンドラーを使用するアプリをプログラムしました。ハンドラー内には、いくつかのネットワーク操作があります。ハンドラーの間隔は min*1000*60 ms です。min=5 でハンドラーを使用したため、5 分後に繰り返す必要があります。しかし、これは私のチェックの結果です:

最初のハンドラー:

16:20:22
16:25:23
17:01:52
17:13:07
17:20:19
17:25:55

2 番目のハンドラー:

16:20:26
16:25:26
17:01:35
17:12:51
17:20:02
17:25:37

3 番目のハンドラー:

16:24:58
16:31:59
17:12:43
17:19:54
17:25:30

すべてのハンドラは個別のサービスで実行されています。画面がオフになります。Android の Handler のアイデアや代替案はありますか?

ハンドラのコードはとてもシンプルです:

handler.postDelayed(new Runnable() {
            public void run() {
            // network operations
            }
        }, interval);
4

2 に答える 2

1

Handlerまず、 viaを作成したと仮定するとnew Handler()、それはメイン アプリケーション スレッドでその作業を行います。メイン アプリケーション スレッドでネットワーク I/O を実行しないでください。それはまた、あなたのドリフトの原因である可能性があります.

第二に、ほとんどの場合、3 つのサービスは必要ありません。通常、1 つのサービスが必要です。3 つのサービスは、アプリを複雑にするだけで、ユーザーにとって付加価値はありません。

第三に、あなたのHandler意志はデバイスが起動している間だけ機能し、それが許容できる制限であるかどうかはわかりません.

第 4 に、a を使用するHandlerとサービスが無期限に実行されることを意味し、ユーザーはこれを好まない。サービスがユーザーに積極的に価値を提供している場合にのみ、サービスをメモリに格納します

したがって、これを実装するより良い方法はAlarmManager、スケジュールされたイベントに使用することです。デバイスがスリープ状態のときにイベントを処理する必要がない場合は、 からAlarmManager直接サービスに制御を渡すことができます。理想的にはIntentService、サービスがバックグラウンド スレッドを自動的に提供し、作業が完了するとサービスが自動的にシャットダウンするようにするためです。

デバイスがスリープ中でもイベントを処理する必要がある場合は、ネットワーク I/O を行うために 5 分ごとにデバイスを起動するなど、「何もしない」オプションを含め、イベント期間をユーザーが制御できるようにしてください。バッテリーに悪いでしょう。次に、 または を使用WakefulBroadcastReceiverて、デバイスを起動したまま作業を行うWakefulIntentServiceように手配します。

于 2013-09-04T16:02:43.107 に答える