読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Broadcast契機でのANRを回避する

概要

Broadcast受信時、処理に10秒以上かかるとANRとなってしまう
これを回避するために、Broadcast Receiverでは重い処理を行わず、IntentServiceに委ねる

詳細

Broadcast Receiverは短時間で終わる処理を前提に作られている、もし重い処理をしたい場合にはIntentServiceを利用する
IntentServiceはUIスレッドではない、別スレッドで処理が行われるので時間がかかる処理を行うことに適している

ANRを回避するためのBroadcast Receiverは以下のようになる

public class MyReceiver extends BroadcastReceiver {
	public void onReceive(Context context, Intent intent) {
		Intent intent = new Intent(context, MyService.class);
		context.startService(intent);
	}
}

public class MyService extends IntentService {
	protected void onHandleIntent(Intent intent) {
		try {
			// 重い処理
			thread.sleep(1000);
		}catch (InterruptedExeption e) {

		}
	}
}

IntentServiceは仕様上連続してBroadcastを受け取っても順番に処理を行う
そのため、並列に処理を行いたい場合はServiceを使い、Service内でthreadを作成する必要がある
だがServiceのonStartCommandなどのメソッドはUIスレッドが使われているので気をつける

参考

IntentServiceを使って非同期処理を行う « Tech Booster

良いAndroidアプリを作る139の鉄則

良いAndroidアプリを作る139の鉄則