2016-08-24 3 views
4

BroadcastReceiverでネットワーク操作を実行する必要があります。BroadcastReceiverで新しいスレッドを開始するのは安全ですか?

これまでのところ私は、新しいスレッドを開始することでそれを達成:

@Override 
public void onReceive(Context context, Intent intent) { 
    new Thread(new Runnable() { 
     public void run() { 
      // network stuff... 
     } 
    }).start(); 
} 

は、スレッドが実行される前に、プロセスが殺されるという危険性はありますか?

代わりにIntentServiceを使用する方が良いですか?他のどんな良いアプローチですか?

答えて

7

スレッドが完了する前にプロセスが強制終了される危険性はありますか?

この受信者がマニフェスト経由で登録されている場合は、はいです。

この受信者がregisterReceiver()で登録されている場合、プロセスの有効期間は他の実行中のコンポーネントによって決まります。

代わりにIntentServiceを使用する方が良いでしょうか?

この作業が数ミリ秒を超える場合、IMHOはい、恐らくWakefulBroadcastReceiverと協調します。

その他の方法はありますか?

ANRをトリガーする前に、別のスレッドで作業する時間を与える​​があります。私はこれを避けています、なぜなら、これは文書化されていないからです。たとえば、あなたの質問に直接対処するわけではありません。このバックグラウンドスレッドが作業をしている間に、プロセスの重要性は何ですか?これは、私たちの仕事が完了するのに十分長くデバイスを起き続けるのですか?等々。 IntentServiceまたは他の形式のServiceを使用します。ここで契約の理解を深めることができます。

1

これはお勧めできません。 BroadcastReceiverのライフサイクルは、onReceive()が終了した後、それが破棄されるまで続きます。新しいスレッドの実行を開始する場合は、スレッドが完了する前にBroadcastReceiverが強制終了される可能性があります。これは予期しない動作に巻き込まれます。

あなたが言ったように、より良いオプションは、バックグラウンドサービスを開始することです。

関連する問題