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

Posted

技术标签:

【中文标题】如果结果已经可用,则仅在单击按钮时启动异步任务并执行操作,否则等待结果然后执行操作【英文标题】:Starting an async task and make an action only when button clicked if result already available otherwise wait for result and then make action 【发布时间】:2020-01-25 17:01:04 【问题描述】:

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

@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 中显示第一个活动后立即启动异步调用,以使用户在单击按钮时看起来更快。因此,异步调用在活动创建后立即开始,如果结果已经可用,则当用户单击按钮时,下一个活动开始,否则显示进度条,直到结果可用,一旦结果准备好第二个活动开始。最好的方法是什么?

【问题讨论】:

现在发生了什么不正确? 没什么,它工作正常,我只想在用户点击按钮之前启动异步任务,这样当他点击它时,结果可能已经可用或至少它固定结果. 【参考方案1】:

onCreate:启动任务

AsyncTask:当任务完成时,检查用户是否已经点击了按钮。如果是这样,开始下一个活动。如果没有,则存储任务的结果,如果不需要结果,则只存储一个标志。

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

【讨论】:

以上是关于如果结果已经可用,则仅在单击按钮时启动异步任务并执行操作,否则等待结果然后执行操作的主要内容,如果未能解决你的问题,请参考以下文章

仅在单击按钮时运行 celery 任务

应用内购买仅在首次应用启动时失败

仅在单击指定按钮时如何启动 DropDownList SelectedIndexChanged 事件?

活动丢失后终止异步任务

页面仅在第一次通过 jquery 在 mvc 中刷新 ajax 调用响应

如何仅在JavaScript中单击按钮时执行操作