在我的活动1中,我有一个上传到服务器的AsyncTask。启动此任务后,我想启动活动,而无需等待 AsyncTask 完成。当活动 1 中的 AsyncTask 完成时,我想更新活动 2 中的某些内容。经过一些搜索,我找到了多个使用接口的参考/示例。但是我遇到了以下问题:
上传完成的界面
public interface OnUploadCompleted {
void on UploadCompleted();
}
活动2
public class Activity2 extends Activity implements OnUploadCompleted {
// all the usual activity code
@Override
public void onUploadCompleted() {
Toast.makeText(this, "Upload Done", ....
}
}
活动1
public class Activity1 extends Activity {
// all the usual activity code
private class Upload extends AsyncTask<...> {
OnUploadCompleted listener;
public Upload(OnUploadCompleted listener) {
this.listener = listener;
}
// skipping doInBackground task
@Override
protected void onPostExecute(...) {
super.onPostExecute();
listener.onUploadCompleted();
}
}
void foo (...) {
OnUploadCompleted listener = new Activity2();
Upload upload = new Upload(listener);
upload.execute();
finish();
}
}
我遇到的问题出在 foo() 函数中。 侦听器是 Activity2 类的新实例,但尚未创建 Activity2。它将由 Activity1 的父活动在 finish() 之后创建。因此,当侦听器实际被调用时,它"连接"到的活动为 null。在 onUploadCompleted() 中,当调用 Toast 时,"this" 为空。
活动 1 的 AsyncTask 完成时从活动 1 向 ACtivity2 发送广播...
public class MainActivity extends Activity {
public static final String ACTION_TASK_COMPLETED = "com.sample.project.action.ACTION_TASK_COMPLETED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class DoTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// please wait. I am doing work
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// yay... work completed...
Intent intent = new Intent(ACTION_TASK_COMPLETED);
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(intent);
}
}
}
public class SecondActivity extends Activity {
private TaskReceiver taskReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter intentFilter = new IntentFilter(MainActivity.ACTION_TASK_COMPLETED);
taskReceiver = new TaskReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(taskReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(taskReceiver);
}
private void onUploadImage() {
// uploading completed...
}
private class TaskReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
onUploadImage();
}
}
}