如何将结果从 AsyncTask 从活动 1 发送到活动 2



在我的活动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();
    }
}
}

最新更新