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

标签 java android asynchronous android-asynctask retrofit2

我有这段代码可以在后台进行异步调用,显示进度条并在单击按钮时启动另一个 Activity :

@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];
    }
}

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

最佳答案

onCreate:启动任务

AsyncTask:当任务完成时,检查用户是否已经单击了按钮。如果是,则开始下一个 Activity 。如果没有,则存储任务的结果,或者如果不需要结果,则仅存储一个标志。

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

关于java - 仅当结果已可用时启动异步任务并在单击按钮时执行操作,否则等待结果然后执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58099462/

相关文章:

java - 以下代码不适用于 Chrome 浏览器

java - Web 服务的部署策略

java - 您使用 GWT 的体验如何?

android - Matlab audioread/audioplay 通过 Coder 转换为 C/C++

javascript - 如何从异步调用返回响应?

javascript - 为什么我的函数在调用较长时间后会失败?

java - 使用 Java JDBC 驱动程序连接到 DB2 源时出现异常

java - 在Eclipse上将android库导入到JAVA项目中

android - 如何查找类型为 java.lang.RuntimeException : Parcel android. os.Parcel@#### 的崩溃源:在偏移量 YYY 处解码未知类型代码 XXXX

asynchronous - 无法使用 `impl Future` 将异步函数存储在向量中