Запуск асинхронной задачи и выполнение действия только при нажатии кнопки, если результат уже доступен, в противном случае дождитесь результата и затем выполните действие - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть этот код для выполнения асинхронного вызова в фоновом режиме, отображения индикатора выполнения и запуска другого действия при нажатии кнопки:

@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 Ответ

1 голос
/ 25 сентября 2019

onCreate: запустить задачу

AsyncTask: когда задача завершится, проверьте, нажал ли пользователь на кнопку.Если так, начните следующее действие.Если нет, сохраните результат задачи или просто отметку, если результат не нужен.

onClick: Проверьте, выполнена ли задача.Если так, начните следующее действие.Если нет, покажите индикатор прогресса и установите флаг, указывающий, что пользователь нажал кнопку.

...