onPostExecute Outer ASyncTask во вложенных ASyncTask, вызываемых до завершения всей работы

У меня есть несколько асинхронных задач, которые получают данные из служб JSON. В onPreExecute внешней задачи я хочу показать progressDialog. Я хочу отклонить его в onPostExecute и начать другое действие.

Проблема в том, что при вызове моего onPostExecute по-прежнему происходит загрузка данных, поэтому следующее действие выполняется без необходимых данных.

Это нормальное поведение? Есть ли обходной путь?

 class GetDataAsync extends AsyncTask<Integer, Integer, Integer> {
        @Override
        protected void onPreExecute() {
            Log.d("startupflow","GetDataAsync onPreExecute");
            progress = new ProgressDialog(Login.this);
            progress.setMessage("Loading...");
            progress.show();
            super.onPreExecute();
        }

        @Override
        protected Integer doInBackground(Integer... params) {
            Log.d("startupflow","GetDataAsync doInBackground");
            GetData getData = new GetData();
            getData.LoadAllData(getApplicationContext(), token, client);
            return null;
        }

        @Override
        protected void onPostExecute(Integer integer) {
            Log.d("startupflow","GetDataAsync onPostExecute");
            if (progress.isShowing()) {
                progress.dismiss();
            }
            Intent intent = new Intent(Login.this, Admin.class);
            startActivity(intent);
            super.onPostExecute(integer);
        }

В классе GetData:

public void LoadAllData(Context context, Token token, OAuth2Client client) {
        this.context = context;
        this.token = token;
        this.client = client;

        new AllDataAsync().execute();
    }

class AllDataAsync extends AsyncTask<Integer, Integer, Integer> {

        @Override
        protected Integer doInBackground(Integer... params) {
            try {
                Log.d("GetData", "In AllDataAsyc, do in background");
                GetClientandToken(token, client);
                Log.d("GetData", "getcompanyanddatatapstask");
                new GetCompanyAndDataTapsTask().execute();
                Log.d("GetData", "getslidestask");
                new GetSlidesTask().execute();
            } catch (Exception e) {
                e.printStackTrace();
                errorOccurred = true;
            }
            return null;
        }
    }

Журнал:

08-12 11:27:37.515   D/startupflow﹕ GetDataAsync onPreExecute
08-12 11:27:37.562   D/startupflow﹕ GetDataAsync doInBackground
08-12 11:27:37.601   D/startupflow﹕ GetDataAsync onPostExecute
08-12 11:27:40.132   D/startupflow﹕ all data saved

person TomCB    schedule 12.08.2014    source источник
comment
вы должны использовать onProgressUpdate вместо onPostExecute, чтобы отобразить диалоговое окно, проверьте асинхронную задачу Google для получения дополнительной информации.   -  person mmlooloo    schedule 12.08.2014
comment
Основная проблема заключается в переходе к другому действию до загрузки всех данных. Я добавил фрагменты кода для ясности.   -  person TomCB    schedule 12.08.2014


Ответы (1)


Причина, по которой ваш первый асинхронный процесс запускает действие раньше, заключается в том, что он только запускает второй асинхронный процесс загрузки данных. AsyncTasks работают в разных потоках (следовательно, асинхронно), то есть они не ждут друг друга.

Что вы можете сделать, так это вызвать функцию в postExecute асинхронной загрузки данных, чтобы уведомить вашу активность о том, что она сделана. Например. добавьте функцию onFinishedLoadingData и вызовите ее в файле postExecute. Вы можете начать свою новую деятельность там.

person NameSpace    schedule 12.08.2014