Асинхронное задание и индикатор выполнения - PullRequest
0 голосов
/ 04 июня 2019

У меня есть две асинхронные задачи.Допустим, A и B. A сначала выполняется, а на посту вызывается B.Теперь мне нужно показать индикатор выполнения после завершения задачи B.Например, процент от 0, начинающийся с A и до 100, заканчивающийся на B. Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

в вашем onPreExecute и onProgressUpdate из асинхронной задачи A:

  @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //show progress bar

    }
    @Override
    protected void onProgressUpdate(Integer... progress) {
     ProgressBar.setProgress(progress[0]/2)//we will take only 50% of the progress
    }

в вашей onPostExecute и onProgressUpdate в вашей асинхронной задаче B

    @Override
    protected void onProgressUpdate(Integer... progress) {
    ProgressBar.setProgress(progress[0]/2)//we will take the other  50% of the progress
    }
    @Override
    protected void onPostExecute(String result){
    //hide progress here
    } 

пожалуйста, убедитесь, что ваш индикатор выполнения является локальным, чтобы вы могли получить к нему доступ из обоих asynctask

0 голосов
/ 04 июня 2019

В AsyncTasks вы можете обновить пользовательский интерфейс для onProgressUpdate или onPostExecute обратных вызовов.Эти два обратных вызова выполняются в потоке main (UI) , в то время как doInBackground выполняется в потоке worker .

Для выполнения прогресса "B"бар, показывающий после завершения AsynctaskA Я бы начал AsyncTaskB в onPostExecute обратном вызове AsyncTaskA, затем обновил бы индикатор выполнения B в onProgressUpdate обратном вызове

public ProgressBar progressBarA = ProgressBar(this); // init with a progress bar coming from the UI here
public ProgressBar progressBarB = ProgressBar(this); // init with a progress bar coming from the UI here

    private class AsyncTaskA extends AsyncTask<Void, Integer, Boolean> {
        protected Boolean doInBackground(Void... params) {
            // do something in the background here
            for (int i = 0; i < 100; i++) {
                publishProgress(i);
            }
            return true;
        }

        protected void onProgressUpdate(Integer... progress) {
            progressBarA.setProgress(progress[0]);
        }

        protected void onPostExecute(Void result) {
            AsyncTaskB taskB = new AsyncTaskB();
            taskB.execute();
        }
    }

    private class AsyncTaskB extends AsyncTask<Void, Integer, Boolean> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBarB.setProgress(0);
        }

        protected Boolean doInBackground(Void... params) {
            // do something in the background here
            for (int i = 0; i < 100; i++) {
                publishProgress(i);
            }
            return true;
        }

        protected void onProgressUpdate(Integer... progress) {
            progressBarB.setProgress(progress[0]);
        }

        protected void onPostExecute(Void result) {
            // Toast work complete!
        }
    }
...