【发布时间】:2023-03-15 08:09:01
【问题描述】:
我只想问我解决以下问题的最佳方法是什么。情况是这样的。
1.) 我有 ActivityA 和 ActivityB。
2.) 用户在 ActivityA 中处理某事(AsyncTask),现在用户在等待时,他去了 ActivityB。
3.) 因此,当用户在 ActivityB 中时,任务在 ActivityA 中成功完成。我将如何通知 ActivityB 任务已经完成 在 ActivityA 中完成?
【问题讨论】:
我只想问我解决以下问题的最佳方法是什么。情况是这样的。
1.) 我有 ActivityA 和 ActivityB。
2.) 用户在 ActivityA 中处理某事(AsyncTask),现在用户在等待时,他去了 ActivityB。
3.) 因此,当用户在 ActivityB 中时,任务在 ActivityA 中成功完成。我将如何通知 ActivityB 任务已经完成 在 ActivityA 中完成?
【问题讨论】:
听起来您可能正在寻找某种事件总线。
Activity A 的 AsyncTask 完成后将创建一个事件,并且订阅该事件类型的任何人都会收到通知。
【讨论】:
您可以使用LocalBroadcastManager。当 ActivityA 中的 AsyncTask 完成时。 发送一个 ActivityB 可以接收的广播。那么ActivityB就会知道任务已经完成了。
活动A:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ActivityA.this,ActivityB.class));
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
//do some long work
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent("ACTION_TASK_DONE"));
}
}.execute();
}
});
}
活动B:
private BroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(ActivityB.this,"Task done!" , Toast.LENGTH_SHORT).show();
}
};
LocalBroadcastManager.getInstance(getApplicationContext())
.registerReceiver(broadcastReceiver, new IntentFilter("ACTION_TASK_DONE"));
}
@Override
protected void onDestroy() {
super.onDestroy();
if (broadcastReceiver != null) {
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(broadcastReceiver);
}
}
【讨论】:
您可以使用onPostExecute 方法通知用户任务已完成。在你的异步任务中添加给定的方法 -
protected void onPostExecute(Long result) {
//notify the user
}
这个方法会在异步任务完成时被调用。
【讨论】:
在您的帖子中执行 Intent 您从 A 到 B 的活动
protected void onPostExecute(Long result) {
Intent intent=new Intent(A.this,B.class);
startactivities(intent);
}
或者如果你想在 doinbackground..使用 runonUITheread
【讨论】:
您可以在活动 B 中使用BroadcastReceiver 并从 onPostExecute 调用“sendBroadcast(Intent)”以在活动 B 中通知
【讨论】: