onPostExecute Външна ASyncTask във вложени ASyncTasks, извикана преди приключване на цялата работа

Имам няколко асинхронни задачи, които получават данни от JSON услуги. В onPreExecute на външната задача искам да покажа прогрес Диалог. Искам да го отхвърля в 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 async task doc за допълнителна информация.   -  person mmlooloo    schedule 12.08.2014
comment
Основният проблем е преминаването към друга дейност, преди всички данни да бъдат заредени. Добавих кодови фрагменти за яснота.   -  person TomCB    schedule 12.08.2014


Отговори (1)


Причината, поради която вашият първи асинхронен файл стартира дейността рано, е, че той стартира само втория асинхронен код за зареждане на данни. AsyncTask работят върху различни нишки (следователно асинхронни), което означава, че не чакат една друга.

Това, което можете да направите, е да извикате функция в postExecute на async за зареждане на данни, за да уведомите дейността си, че е извършена. напр. добавете функция onFinishedLoadingData и я извикайте в postExecute. Можете да започнете новата си дейност там.

person NameSpace    schedule 12.08.2014