ActivityA と ActivityB の 2 つのアクティビティがあります。ActivityA は、長時間実行されるプロセス (Web 上のデータの取得など) を開始します。ユーザーはいつでも ActivityB に進むことを決定できます。長期実行プロセスが終了するとすぐに、その結果が ActivityA または ActivityB (その時点でアクティブな方) 内に表示されます。
これを実装するために、ActivityA にワーカー スレッドを作成します。ActivityA と ActivityB は両方ともLocalBroadcastManager
、長時間実行プロセスの終了を通知され、その結果を取得するために に依存しています。
この実装は機能しているように見えますが、いくつかのコーナー ケースが欠けているのではないかと思います。IntentService
ここ SO では、AsyncTask
、、 についての議論が見られるHandlerThread
ので、私のアプローチが単純すぎるのではないかと心配しています。私はこれを正しい方法でやっていますか?そうでない場合、何が欠けていますか?
私の質問を説明するためのコードスニペットを次に示します。
アクティビティA
public class ActivityA extends Activity {
public static final String BROADCAST_MESSAGE = "spike.workerthread.event.resultReady";
public static final String RESULT_KEY = "spike.workerthread.result";
private LocalBroadcastManager localBroadcastMgr;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
localBroadcastMgr = LocalBroadcastManager.
getInstance(getApplicationContext());
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TextView resultTextView = (TextView) findViewById(R.id.result);
resultTextView.setText(intent.getStringExtra(RESULT_KEY));
}};
localBroadcastMgr.registerReceiver(receiver,
new IntentFilter(BROADCAST_MESSAGE));
}
public void startFetchingResultFrom(final ResultProvider provider) {
Thread thread = new Thread() {
@Override
public void run() {
String result = provider.getResult(); // Can take a long time...
Intent intent = new Intent(BROADCAST_MESSAGE);
intent.putExtra(RESULT_KEY, result);
localBroadcastMgr.sendBroadcast(intent);
}
};
thread.start();
}
public void startActivityB() {
Intent intent = new Intent(getApplicationContext(), ActivityB.class);
startActivity(intent);
}
}
活動B
public class ActivityB extends Activity {
private LocalBroadcastManager localBroadcastMgr;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
localBroadcastMgr = LocalBroadcastManager.getInstance(getApplicationContext());
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TextView resultTextView = (TextView) findViewById(R.id.result);
resultTextView.setText(intent.getStringExtra(ActivityA.RESULT_KEY));
}};
localBroadcastMgr.registerReceiver(receiver, new IntentFilter(ActivityA.BROADCAST_MESSAGE));
}
}