Как изменить текст progressDialog

У меня есть asynctask, но если я реализую Thread.Sleep, то мое приложение падает, я не знаю, почему в onPreExecute я вижу свое первое сообщение, а затем через две секунды появляется другое, которое я помещаю в doInBackground, но оно не работает

private class sendMail extends AsyncTask<Void, Void, Void> {


        protected void onPreExecute() {
            dialog.setMessage("Please wait...");
            dialog.show();

        }

        // automatically done on worker thread (separate from UI thread)
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            dialog.setMessage("Downloading files...");

            new BackgroundTask().execute();

//MY DOWNLOADING METHODS STUFF

А потом я закрываю этот диалог где-то еще

Журнал

Произошла ошибка при выполнении doInBackground()

2 ответа

Решение

Вы не можете получить доступ к элементам пользовательского интерфейса из фонового потока, вы можете обновить индикатор выполнения в onProgressUpdateсамое главное надо publishProgress(value) в doInBackground и обновлять используя onProgressUpdate, Узнайте больше об AsyncTask здесь.

Пример кода:

class MyTask extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... params) {
            for (; count <= params[0]; count++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(count);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Task Completed.";
        }
        @Override
        protected void onPostExecute(String result) {
            progressBar.setVisibility(View.GONE);
                txt.setText(result);
                btn.setText("Restart");
        }
        @Override
        protected void onPreExecute() {
            txt.setText("Task Starting...");
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            txt.setText("Running..."+ values[0]);
            progressBar.setMessage("Downloading files...");
            progressBar.setProgress(values[0]);
        }
    }

Используйте поток пользовательского интерфейса, чтобы показать диалоговое сообщение в doInBackground, обратитесь по этому /questions/3314466/vyipolnenie-zadachi-polzovatelskogo-interfejsa-v-doinbackground-v-android/3314476#3314476

Другие вопросы по тегам