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

Допустим, у меня есть WebClient, который должен проходить повторную аутентификацию каждые 60 минут, чтобы быть актуальным.У меня есть AsyncTask с именем ReauthenticateTask, который обрабатывает сетевые ресурсы, необходимые для повторной аутентификации моего клиента.Каждый раз, когда пользователь выполняет какое-либо действие, требующее WebClient, я проверяю его подлинность перед продолжением.В большинстве случаев это работает, но когда пользователь на долгое время выходит из моего приложения и возвращается обратно, мое приложение вылетает, потому что я пытаюсь сделать звонок с просроченным (больше не прошедшим проверку подлинности) клиентом.

Мой вопрос: где я могу добавить свою проверку подлинности, чтобы я мог убедиться, что мой WebClient обновлен, прежде чем продолжить?В частности, мне нужно делать эту проверку каждый раз, когда пользователь делает вкладки безопасными.

Я пытался добавить его в onResume () и onStart (), но я не уверен, как заставить onStart () ждатьчтобы мой ReauthenticateTask завершился, прежде чем продолжить ...

Это то, что я пробовал в моем ActivityHome:

@Override
protected void onStart() {
    super.onStart();
    // Need to make sure we are authenticated
    if (!App.getAccountHelper().isAuthenticated()) {
        new Utils.ReauthenticateTask(new ReauthenticateListener() {
            @Override
            public void UserAuthenticated() {
                // resume onStart() safely
            }
        }).execute();
    }
    // else client is authenticated
}

ReauthenticateTask:

public static class ReauthenticateTask extends AsyncTask<Void, Void, Void> {
    ReauthenticateListener listener;

    public ReauthenticateTask(ReauthenticateListener listener){
        this.listener = listener;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        // do reauthentication stuff
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        listener.UserAuthenticated();
    }     
}
...