Обновите ProgressBar с помощью CountDownTimer

Я пытаюсь обновить ProgressBar с помощью AsyncTask и CountDownTimer. У меня нет ошибок, но ProgressBar не обновляется.

Поскольку MyDownloadTask расширяет AsyncTask, мне не нужны ни метод публикации, ни onProgressUpdate(). Мой ProgressBar автоматически обновляется в doInBackground ().

Я думаю, что код в CountDownTimer не выполняется, но я звоню monCountTimer.start();

Вот мой Java-код:

public class myDownloadTask extends AsyncTask<Integer, Integer, String> {
    public void setMonCountTimer(CountDownTimer monCountTimer) {
        this.monCountTimer = monCountTimer;
    }

    public void setInc(int inc) {
        this.inc = inc;
    }

    public void setMaProgressBar(ProgressBar maProgressBar) {
        this.maProgressBar = maProgressBar;
    }

    public CountDownTimer getMonCountTimer() {

        return monCountTimer;
    }

    public int getInc() {
        return inc;
    }

    public ProgressBar getMaProgressBar() {
        return maProgressBar;
    }

    protected CountDownTimer monCountTimer;
    private int inc = 0;
    protected ProgressBar maProgressBar;

    public void setMonAct(MainActivity monAct) {
        this.monAct = monAct;
    }

    public MainActivity getMonAct() {
        return monAct;
    }

    private MainActivity monAct;


    public myDownloadTask(ProgressBar maBarre, MainActivity monActi) {
        this.maProgressBar = maBarre;
        this.monAct = monActi;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        this.maProgressBar.setProgress(0);

    }

    @Override
    protected void onProgressUpdate(Integer... integers) {
        super.onProgressUpdate(integers);

    }

    @Override
    protected String doInBackground(Integer... integers) {
        Thread monThread = new Thread(new Runnable() {
            @Override
            public void run() {
                monCountTimer = new CountDownTimer(6000, 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        myDownloadTask.this.inc++;
                        myDownloadTask.this.getMaProgressBar().setProgress((int) myDownloadTask.this.inc* 100 / (6000 / 1000));
                    }
                    @Override
                    public void onFinish() {
                    }

                };
                monCountTimer.start();
            }
        });
        return "coucou";
    }
}

Основной класс:

public class MainActivity extends AppCompatActivity  {

    private ProgressBar maBarre ;

    public void setMaBarre(ProgressBar maBarre) {
        this.maBarre = maBarre;
    }

    public void setLaunchAsync(Button launchAsync) {
        this.launchAsync = launchAsync;
    }

    public void setMonHandler(Handler monHandler) {
        this.monHandler = monHandler;
    }

    public void setMonCountTimer(CountDownTimer monCountTimer) {
        this.monCountTimer = monCountTimer;
    }

    public void setMonTask(myDownloadTask monTask) {
        this.monTask = monTask;
    }

    public void setProgressThread(Thread progressThread) {
        ProgressThread = progressThread;
    }

    public void setI(int i) {

        this.i = i;
    }

    public ProgressBar getMaBarre() {

        return maBarre;
    }

    public Button getLaunchAsync() {
        return launchAsync;
    }

    public Handler getMonHandler() {
        return monHandler;
    }

    public CountDownTimer getMonCountTimer() {
        return monCountTimer;
    }

    public String getPROGRESS_BAR_INCREMENT() {
        return PROGRESS_BAR_INCREMENT;
    }

    public static int getMessagePreExecute() {
        return MESSAGE_PRE_EXECUTE;
    }

    public static int getMessageProgressUpdate() {
        return MESSAGE_PROGRESS_UPDATE;
    }

    public static int getMessagePostExecute() {
        return MESSAGE_POST_EXECUTE;
    }

    public myDownloadTask getMonTask() {
        return monTask;
    }

    public Thread getProgressThread() {
        return ProgressThread;
    }

    public int getI() {
        return i;
    }

    private Button launchAsync;
    private Handler monHandler ;
    private CountDownTimer monCountTimer ;

    private final String PROGRESS_BAR_INCREMENT = "ProgreesBarIncrementId";
    private static final int MESSAGE_PRE_EXECUTE = 1;
    private static final int MESSAGE_PROGRESS_UPDATE = 2;
    private static final int MESSAGE_POST_EXECUTE = 3;
    myDownloadTask monTask;
    Thread ProgressThread ;
    private int i = 0 ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        maBarre = (ProgressBar) findViewById(R.id.progressBar);
        launchAsync = (Button) findViewById(R.id.button);
        setSupportActionBar(toolbar);


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        this.launchAsync.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                monTask = new myDownloadTask(MainActivity.this.maBarre , MainActivity.this);
                monTask.execute();
             
                }
        });

    }



 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
    }

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }

}

Не могли бы вы мне помочь, пожалуйста?

Привет. Я постараюсь помочь. Было бы хорошо провести еще немного анализа того, что может быть не так. Также было бы хорошо опубликовать макет xml. Но первое, что нужно сделать, - это разрезать задачу пополам. Это проблема с презентацией? Или проблема в логике обновления индикатора выполнения? Если, например, в onCreate добавить maBarre.setProgress (50), на экране появится индикатор выполнения?

Elletlar 16.07.2018 17:57

Хорошо. Лучше всего отредактировать исходный вопрос, добавив дополнительную информацию. Не размещайте его в ответе, пока не будет найдено решение. Если вы разместите код в ответе, вы получите отрицательное голосование, что снизит вероятность получения полезного ответа, поскольку меньше людей увидят вопросы, на которые проголосовали против. Вы сделали то, что я предложил? Попробуйте вызвать setProgress (50) в onCreate, чтобы убедиться, что прогресс отображается на экране? Если он не появляется, скорее всего, это проблема с макетом.

Elletlar 16.07.2018 19:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
565
4

Ответы 4

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:theme = "@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id = "@+id/toolbar"
            android:layout_width = "match_parent"
            android:layout_height = "?attr/actionBarSize"
            android:background = "?attr/colorPrimary"
            app:popupTheme = "@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout = "@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android:id = "@+id/fab"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_gravity = "bottom|end"
        android:layout_margin = "@dimen/fab_margin"
        app:srcCompat = "@android:drawable/ic_dialog_email" />





</android.support.design.widget.CoordinatorLayout>

Пожалуйста, предоставьте одно объясненное решение. Или убедитесь, что каждое из ваших решений фундаментально отличается от других и делает очевидным, каким образом. У меня сложилось впечатление, что вам следует добавить информацию к вопросу вместо этих необъяснимых дампов кода ...

Yunnosch 14.06.2021 09:01
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:layout_behavior = "@string/appbar_scrolling_view_behavior"
tools:context = ".MainActivity"
tools:layout_editor_absoluteY = "81dp"
tools:showIn = "@layout/activity_main">

            <Button
            android:id = "@+id/button"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:layout_marginTop = "236dp"
            android:text = "Button"
            app:layout_constraintEnd_toEndOf = "@+id/progressBar"
            app:layout_constraintHorizontal_bias = "1.0"
            app:layout_constraintStart_toStartOf = "@+id/progressBar"
            app:layout_constraintTop_toTopOf = "parent" />

            <ProgressBar
            android:id = "@+id/progressBar"
            style = "?android:attr/progressBarStyleHorizontal"
            android:layout_width = "200dp"
            android:layout_height = "40dp"
            android:layout_marginBottom = "336dp"
            android:layout_marginEnd = "104dp"
            app:layout_constraintBottom_toBottomOf = "parent"
            app:layout_constraintEnd_toEndOf = "parent" />

    <android.support.constraint.ConstraintLayout
    android:id = "@+id/constraintLayout"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_marginEnd = "8dp"
    android:layout_marginStart = "8dp"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintTop_toTopOf = "parent">

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

Я думаю, что проблема связана с потоком, без AsyncTask, он работает, но не работает должным образом. Я так думаю, я забыл инструкцию monThread.start (). Но с этой инструкцией мое приложение не работает, когда я коснитесь кнопки

alexandre marillesse 16.07.2018 19:26

См. Ответ, который я только что опубликовал. Макет XML не отображал индикатор выполнения в эмуляторе.

Elletlar 16.07.2018 19:51

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

Yunnosch 14.06.2021 09:00

Попробуйте это для своего XML-файла. Я не знаю, какой макет вы пытаетесь достичь, но когда я сделал "setProgress (50);" в onCreate ничего не появилось с использованием опубликованного XML-файла.

Вместо этого я создал этот XML-макет, теперь индикатор выполнения отображается нормально:

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">

    <Button
        android:id = "@+id/button"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_marginBottom = "8dp"
        android:layout_marginEnd = "8dp"
        android:layout_marginStart = "8dp"
        android:layout_marginTop = "8dp"
        android:text = "Button"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toBottomOf = "@+id/progressBar" />

    <ProgressBar
        android:id = "@+id/progressBar"
        style = "?android:attr/progressBarStyleHorizontal"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_marginEnd = "8dp"
        android:layout_marginStart = "8dp"
        android:layout_marginTop = "140dp"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent" />

    <android.support.design.widget.FloatingActionButton
        android:id = "@+id/fab"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_gravity = "bottom|end"
        android:layout_margin = "10dip"
        android:layout_marginBottom = "8dp"
        android:layout_marginEnd = "8dp"
        android:layout_marginStart = "8dp"
        android:layout_marginTop = "8dp"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toBottomOf = "@+id/button"
        app:srcCompat = "@android:drawable/ic_dialog_email" />

</android.support.constraint.ConstraintLayout>

В onCreate добавьте:

ProgressBar bar = findViewById(R.id.progressBar);
bar.setProgress(50);

проверить макет ...

Еще несколько проблем: поток был создан, но после него необходимо вызвать start ().

 monCountTimer.start();

В public void run () код выполняет:

  myDownloadTask.this.getMaProgressBar().setProgress((int) 
    myDownloadTask.this.inc* 100 / (6000 / 1000));

Никогда не обновляйте представления из рабочего потока в Android. Все представления должны быть обновлены в «основном потоке», также известном как «поток пользовательского интерфейса».

Быстрый способ решить эту проблему:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // ...
    }
});

Я внес указанные выше изменения, теперь все работает нормально:

public class MainActivity extends AppCompatActivity  {

    private ProgressBar maBarre ;

    public void setMaBarre(ProgressBar maBarre) {
        this.maBarre = maBarre;
    }

    public void setLaunchAsync(Button launchAsync) {
        this.launchAsync = launchAsync;
    }

    public void setMonHandler(Handler monHandler) {
        this.monHandler = monHandler;
    }

    public void setMonCountTimer(CountDownTimer monCountTimer) {
        this.monCountTimer = monCountTimer;
    }

    public void setMonTask(myDownloadTask monTask) {
        this.monTask = monTask;
    }

    public void setProgressThread(Thread progressThread) {
        ProgressThread = progressThread;
    }

    public void setI(int i) {

        this.i = i;
    }

    public ProgressBar getMaBarre() {

        return maBarre;
    }

    public Button getLaunchAsync() {
        return launchAsync;
    }

    public Handler getMonHandler() {
        return monHandler;
    }

    public CountDownTimer getMonCountTimer() {
        return monCountTimer;
    }

    public String getPROGRESS_BAR_INCREMENT() {
        return PROGRESS_BAR_INCREMENT;
    }

    public static int getMessagePreExecute() {
        return MESSAGE_PRE_EXECUTE;
    }

    public static int getMessageProgressUpdate() {
        return MESSAGE_PROGRESS_UPDATE;
    }

    public static int getMessagePostExecute() {
        return MESSAGE_POST_EXECUTE;
    }

    public myDownloadTask getMonTask() {
        return monTask;
    }

    public Thread getProgressThread() {
        return ProgressThread;
    }

    public int getI() {
        return i;
    }

    private Button launchAsync;
    private Handler monHandler ;
    private CountDownTimer monCountTimer ;

    private final String PROGRESS_BAR_INCREMENT = "ProgreesBarIncrementId";
    private static final int MESSAGE_PRE_EXECUTE = 1;
    private static final int MESSAGE_PROGRESS_UPDATE = 2;
    private static final int MESSAGE_POST_EXECUTE = 3;
    myDownloadTask monTask;
    Thread ProgressThread ;
    private int i = 0 ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        maBarre = (ProgressBar) findViewById(R.id.progressBar);
        launchAsync = (Button) findViewById(R.id.button);
        //etSupportActionBar(toolbar);


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        this.launchAsync.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                monTask = new myDownloadTask(MainActivity.this.maBarre , MainActivity.this);
                monTask.execute();

            }
        });

    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }


    public class myDownloadTask extends AsyncTask<Integer, Integer, String> {
        public void setMonCountTimer(CountDownTimer monCountTimer) {
            this.monCountTimer = monCountTimer;
        }

        public void setInc(int inc) {
            this.inc = inc;
        }

        public void setMaProgressBar(ProgressBar maProgressBar) {
            this.maProgressBar = maProgressBar;
        }

        public CountDownTimer getMonCountTimer() {

            return monCountTimer;
        }

        public int getInc() {
            return inc;
        }

        public ProgressBar getMaProgressBar() {
            return maProgressBar;
        }

        protected CountDownTimer monCountTimer;
        private int inc = 0;
        protected ProgressBar maProgressBar;

        public void setMonAct(MainActivity monAct) {
            this.monAct = monAct;
        }

        public MainActivity getMonAct() {
            return monAct;
        }

        private MainActivity monAct;


        public myDownloadTask(ProgressBar maBarre, MainActivity monActi) {
            this.maProgressBar = maBarre;
            this.monAct = monActi;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            this.maProgressBar.setProgress(0);

        }

        @Override
        protected void onProgressUpdate(Integer... integers) {
            super.onProgressUpdate(integers);

        }

        @Override
        protected String doInBackground(Integer... integers) {
            Thread monThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            monCountTimer = new CountDownTimer(6000, 1000) {
                                @Override
                                public void onTick(long millisUntilFinished) {
                                    myDownloadTask.this.inc++;
                                    myDownloadTask.this.getMaProgressBar().setProgress((int) myDownloadTask.this.inc * 100 / (6000 / 1000));
                                }

                                @Override
                                public void onFinish() {
                                }

                            };
                            monCountTimer.start();

                        }
                    });
                }
            });
            monThread.start();
            return "coucou";
        }
    }
}

Несколько вопросов, о которых стоит подумать:

  • Здесь создается больше потоков, чем нужно, код можно было бы написать проще. doInBackground уже находится в отдельном потоке, поэтому нет необходимости создавать там другой поток. Кроме того, я считаю, что CountDownTimer уже работает в собственном потоке, поэтому, вероятно, большая часть кода здесь не нужна.
  • Когда вы закончите разработку, избавьтесь от всех этих предупреждений. На самом деле разработка программного обеспечения - это дисциплина и хорошие привычки, только плохие разработчики игнорируют предупреждения! Когда закончите, выполните команду «анализировать -> проверять код».

Но теперь у меня работает программа обновления индикатора выполнения.

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

alexandre marillesse 12.08.2018 21:53

Ок, спасибо вам большое !!!!! :))

я пытался :

   @Override
    protected String doInBackground(Integer... integers) {
        Thread monThread = new Thread(new Runnable() {
            @Override
            public void run() {
                monCountTimer = new CountDownTimer(6000, 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        myDownloadTask.this.inc++;
                        myDownloadTask.this.getMaProgressBar().setProgress((int) myDownloadTask.this.inc* 100 / (6000 / 1000));
                    }
                    @Override
                    public void onFinish() {
                    }

                };
                monCountTimer.start();
            }
            monThread.start();

        });
        return "coucou";
    }

с этим кодом мое приложение только что разбилось.

А вот с runOnUiThread(new Runnable() {....} работает

Мы используем 2 Threads ...; (он не оптимизирован и 3 с monCountTimer, возможно, мы могли бы удалить monThread

«Я считаю, что CountDownTimer уже работает в собственном потоке, поэтому, вероятно, здесь нет необходимости в большом количестве кода».

Я пытался :

@Override
protected String doInBackground(Integer... integers) {
    monCountTimer = new CountDownTimer(6000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
        myDownloadTask.this.inc++;
        myDownloadTask.this.getMaProgressBar().setProgress((int) myDownloadTask.this.inc * 100 / (6000 / 1000));
    }

        @Override
        public void onFinish() {
    }

    };
    monCountTimer.start();
}

и это не работает

Хорошо, но, пожалуйста, перестаньте публиковать больше решений ... Можно просто прокомментировать решение, которое я уже опубликовал. Он отлично работает в моей среде, поэтому я не знаю, что вам сказать. Вы должны дать мне кое-что еще, чем просто это не работает. Есть ошибки в логах? Попробуйте вырезать и вставить мой файл в свой проект. Я просто объединил весь ваш код в один класс, чтобы ускорить работу, но он должен работать как есть ... Используйте также мой XML-файл ... G'Luck.

Elletlar 17.07.2018 00:21

да, я сделал это, я проверил ваш код вчера, но нам нужно создать много потоков, это я хотел бы объяснить и использовать runOnUiThread (), я не могу разделить два моих класса для класса myDownloadAsyncTask

alexandre marillesse 17.07.2018 09:44

Это не похоже на ответ на вопрос. Больше похоже на дополнительную информацию, которую следует отредактировать в вопросе.

Yunnosch 14.06.2021 09:00

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