我有两个活动,ActivityA和ActivityB。 ActivityA启动一个长期运行的过程(例如,在Web上检索数据)。用户可以随时决定继续使用ActivityB。一旦长时间运行的过程结束,它的结果应该显示在ActivityA或ActivityB中,无论哪一个当时都处于活动状态。
为了实现这一点,我在ActivityA中创建了一个工作线程,ActivityA和ActivityB都依赖于LocalBroadcastManager
来通知长时间运行的进程结束并获取其结果。
这个实现似乎有效,但我想知道我是否遗漏了一些角落案例。在这里,我看到关于IntentService
,AsyncTask
和HandlerThread
的讨论,所以我担心我的方法可能太天真了。我这样做是正确的吗?如果没有,我错过了什么?
以下是一些代码片段来说明我的问题。
ActivityA
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);
}
}
ActivityB
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));
}
}
答案 0 :(得分:0)
您还可以考虑使“活动”实现一个接口,并在长时间运行的任务完成时调用此接口。
AsyncTask主要用于执行长时间运行的任务,然后轻松更新UI。
IntentService是一个在自己的线程上运行的服务,当您执行的给定任务完成时,它将被终止。
答案 1 :(得分:0)
我的建议是考虑一个设置,它有一个Thread f.e的模型。基于片段的服务或活动。因为如果你在活动A中有你的线程而你继续前进到B,那么你将失去对线程的控制权。你应该避免这种情况。
正如我所说,有一个模型和一些视图,可以随时访问它并控制你的线程。