Java 启动异步任务并仅在单击按钮时执行操作(如果结果已可用),否则等待结果,然后执行操作

Java 启动异步任务并仅在单击按钮时执行操作(如果结果已可用),否则等待结果,然后执行操作,java,android,asynchronous,android-asynctask,retrofit2,Java,Android,Asynchronous,Android Asynctask,Retrofit2,我使用以下代码在后台进行异步调用,显示进度条,并在单击按钮时启动另一个活动: @Override protected void onCreate(Bundle savedInstanceState) { // .... actionButton.setOnClickListener(this); // call action here } @Override public void onClick(View v) { if (v.getId() == R.

我使用以下代码在后台进行异步调用,显示进度条,并在单击按钮时启动另一个活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ....

    actionButton.setOnClickListener(this);

    // call action here
}


@Override
public void onClick(View v) {
    if (v.getId() == R.id.actionButton) {
        setProgressVisibility(VISIBLE);
        new MyActivity.ActionTask().execute(action);
    }
}

private void getAction(Action action) {
    try {
        Call<Action> getAction = api.callAction(model, action);
        Response<Action> response = getAction.execute();
        setProgressVisibility(INVISIBLE);
        if (response.isSuccessful() && response.body() != null) {
            startAction(response.body());
        } else {
            runOnUiThread(() -> showToast(R.string.error, this));
            logger.error(getResources().getString(R.string.error));
        }
    } catch (IOException e) {
        runOnUiThread(() -> showToast(e.getMessage(), this));
        logger.error(e.getMessage());
        setProgressVisibility(INVISIBLE);
    }
}

private void startAction(Action action) {
    Intent intent = new Intent(this, ActionActivity.class);
    intent.putExtra("action", action);
    startActivity(intent);
}

private class ActionTask extends AsyncTask<Action, Void, Action> {
    @Override
    protected Action doInBackground(Action... action) {
        getAction(action[0]);
        return action[0];
    }
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
// ....
actionButton.setOnClickListener(此);
//在这里采取行动
}
@凌驾
公共void onClick(视图v){
if(v.getId()==R.id.actionButton){
可见光;
新建MyActivity.ActionTask().execute(操作);
}
}
私有void getAction(操作){
试一试{
调用getAction=api.callAction(模型,动作);
Response=getAction.execute();
设置可见性(不可见);
if(response.issusccessful()&&response.body()!=null){
startAction(response.body());
}否则{
runOnUiThread(()->showtoos(R.string.error,this));
logger.error(getResources().getString(R.string.error));
}
}捕获(IOE异常){
runOnUiThread(()->showtoos(例如getMessage(),this));
logger.error(例如getMessage());
设置可见性(不可见);
}
}
私人无效启动(行动){
意向意向=新意向(此,ActionActivity.class);
意图。额外(“行动”,行动);
星触觉(意向);
}
私有类ActionTask扩展了AsyncTask{
@凌驾
受保护的行动背景(行动…行动){
getAction(action[0]);
返回操作[0];
}
}

我希望在OnCreate中显示第一个活动时立即启动异步调用,以使用户在单击按钮时看起来更快。因此,异步调用在创建活动后立即开始,然后当用户单击按钮(如果结果已经可用)时,下一个活动开始,否则将显示进度条,直到结果可用,并且一旦结果准备就绪,第二个活动开始。最好的方法是什么?

onCreate:启动任务

AsyncTask:任务完成后,检查用户是否已单击该按钮。如果是,请开始下一个活动。如果不是,则存储任务的结果,如果不需要结果,则仅存储一个标志


onClick:检查任务是否完成。如果是,请开始下一个活动。如果没有,则显示进度指示器,并设置一个标志,指示用户已单击按钮。

现在发生了什么,这是不正确的?没什么,它工作正常,我只是希望异步任务在用户单击按钮之前启动,这样当用户单击按钮时,结果可能已经可用,或者至少是它的结果。