Android, как работать с асинхронными заданиями - PullRequest
28 голосов
/ 23 июня 2011

Asynctask имеет 4 метода переопределения onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute() кроме onProgressUpdate все работают. Что я должен сделать, чтобы onProgressUpdate () работал. Кто-нибудь может, пожалуйста, кратко объяснить мне, что толку от onProgressUpdate(), что следует написать в этом?

Ответы [ 5 ]

57 голосов
/ 23 июня 2011

onProgressUpdate() используется для управления процессом выполнения асинхронных операций с помощью этого метода. Обратите внимание на параметр с типом данных Integer. Это соответствует второму параметру в определении класса. Этот обратный вызов может быть вызван из тела doInBackground() метода путем вызова publishProgress().

Пример

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AsyncTaskExample extends Activity {

    protected TextView _percentField;

    protected Button _cancelButton;

    protected InitTask _initTask;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _percentField = (TextView) findViewById(R.id.percent_field);
        _cancelButton = (Button) findViewById(R.id.cancel_button);
        _cancelButton.setOnClickListener(new CancelButtonListener());
        _initTask = new InitTask();
        _initTask.execute(this);
    }

    protected class CancelButtonListener implements View.OnClickListener {

        public void onClick(View v) {
            _initTask.cancel(true);
        }
    }

    /**
     * sub-class of AsyncTask
     */
    protected class InitTask extends AsyncTask<Context, Integer, String> {

        // -- run intensive processes here
        // -- notice that the datatype of the first param in the class definition matches the param passed to this
        // method
        // -- and that the datatype of the last param in the class definition matches the return type of this method
        @Override
        protected String doInBackground(Context... params) {
            // -- on every iteration
            // -- runs a while loop that causes the thread to sleep for 50 milliseconds
            // -- publishes the progress - calls the onProgressUpdate handler defined below
            // -- and increments the counter variable i by one
            int i = 0;
            while (i <= 50) {
                try {
                    Thread.sleep(50);
                    publishProgress(i);
                    i++;
                }
                catch (Exception e) {
                    Log.i("makemachine", e.getMessage());
                }
            }
            return "COMPLETE!";
        }

        // -- gets called just before thread begins
        @Override
        protected void onPreExecute() {
            Log.i("makemachine", "onPreExecute()");
            super.onPreExecute();
        }

        // -- called from the publish progress
        // -- notice that the datatype of the second param gets passed to this method
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.i("makemachine", "onProgressUpdate(): " + String.valueOf(values[0]));
            _percentField.setText((values[0] * 2) + "%");
            _percentField.setTextSize(values[0]);
        }

        // -- called if the cancel button is pressed
        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.i("makemachine", "onCancelled()");
            _percentField.setText("Cancelled!");
            _percentField.setTextColor(0xFFFF0000);
        }

        // -- called as soon as doInBackground method completes
        // -- notice that the third param gets passed to this method
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.i("makemachine", "onPostExecute(): " + result);
            _percentField.setText(result);
            _percentField.setTextColor(0xFF69adea);
            _cancelButton.setVisibility(View.INVISIBLE);
        }
    }
}
20 голосов
/ 23 апреля 2013

4 шага

Когда выполняется асинхронная задача, задача проходит 4 шага:

onPreExecute (), вызывается в потоке пользовательского интерфейса перед выполнением задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

doInBackground (Params ...), вызывается в фоновом потоке сразу после завершения выполнения onPreExecute (). Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен к последнему шагу. Этот шаг также может использовать publishProgress (Progress ...) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate (Progress ...).

onProgressUpdate (Progress ...), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока выполняется фоновое вычисление. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений. Результат вычисления фона передается на этот шаг в качестве параметра.

пример

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

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

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
}

Общие типы AsyncTask Три типа, используемые асинхронной задачей, следующие:

Params, тип параметров, отправляемых заданию при выполнении.

Progress, тип единиц прогресса, опубликованных во время фонового вычисления.

Result, тип результата вычисления фона.

5 голосов
/ 23 июня 2011

Да, вы правы, в AsyncTask

есть четыре метода. При выполнении асинхронной задачи задача проходит 4 этапа:

onPreExecute()

Вызывается на Поток пользовательского интерфейса сразу после выполнения задачи.Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

doInBackground(Params...) 

Вызывается в фоновом потоке сразу после завершения выполнения onPreExecute().Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени.Параметры асинхронной задачи передаются на этот шаг.Результат вычисления должен быть возвращен этим шагом и будет возвращен к последнему шагу.Этот шаг также может использовать publishProgress(Progress...), чтобы опубликовать одну или несколько единиц прогресса.Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate(Progress...).

onProgressUpdate(Progress...)

Вызывается в потоке UI после вызова publishProgress(Progress...).Время выполнения не определено.Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока выполняется фоновое вычисление.Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

onPostExecute(Result)

Вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений.Результат вычисления фона передается на этот шаг в качестве параметра.

Для получения дополнительной информации нажмите здесь

3 голосов
/ 23 июня 2011

onProgressUpdate запускается в потоке пользовательского интерфейса после вызова publishProgress . Из документации AsyncTask - ваш код должен выглядеть примерно так

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
        }
        return totalSize;
    }

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

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}
0 голосов
/ 09 декабря 2016
hey this might help you??

индикатор выполнения автоматически исчезнет, ​​когда вы получите ответ

User_AsyncTaskk extends AsyncTask
 public class User_AsyncTask extends AsyncTask<String, String, String>
    {
        String response = "";

        @Override
        protected void onPreExecute()
        {
            try
            {
                if (progressDialog != null)
                    progressDialog.cancel();
            }
            catch (Exception e)
            {

            }
            progressDialog = ProgressDialog.show(DisplayDetails.this, "", "Please wait...", true, true);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }


 protected String doInBackground(String... params)
        {

            try
            {


               //Complete ur Code

                Log.i("AUTO ", "response  is : " + response);
                return response;
            }

            catch (Exception e)
            {

            }
        }

 @Override
        protected void onPostExecute(String s)
        {
            if (progressDialog != null) {
                progressDialog.dismiss();
                progressDialog = null;
            }

            try {



            }
            catch (Exception e)
            {

            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...