Показывать индикатор выполнения для ожидания тяжелых вычислений - PullRequest
0 голосов
/ 06 июня 2018

Я создаю игру Othello (похожую на игру Go) на устройстве Android с помощью Android Studio.

Я использовал minimax algorithm, чтобы создать умного бота, чтобы победить игрока.Однако в minimax algorithm есть много рекурсивных вызовов, поэтому расчет бота идет очень медленно (я пытался играть и видел, что для расчета потребовалось около 30 секунд).Итак, я хочу показать progress bar, чтобы сообщить игроку, что бот рассчитывает.Я попытался сделать следующее, но индикатор выполнения не отображался в моей активности:

 //Each time the player goes one step, I show progress bar on activity
 // to signal to the player that the bot is calculating
 progress_bar.setVisible(View.VISIBLE);

 //Then, wait for bot's calculation. I have tried to play many time
 //and I saw that it takes about 30 seconds 
 minimax = new Minimax(chessColorMaxtrix);                           
 best_position=minimax.findBestMove();
 put(best_position); //complete bot's calculation

 //Then, I set the progress bar invisible
 progress_bar.setVisible(View.INVISIBLE);
 //And wait for the next move of the player

Далее, если я не выполняю progress_bar.setVisible(View.INVISIBLE);, индикатор выполнения показывает активность нормально.Но это не то, что я хочу.Я хочу спросить, является ли мое progress_bar использование правильным или неправильным?Если правильно, то почему progress_bar не показывался на активности.Если не так, как я могу решить проблему?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Попробуйте использовать AsyncTask для своих целей, например:

YourClass {
 ...
 yourMethod () { 
   new DisplayProgressBarDuringYourOperation().execute();
 }  

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

        /**
         * This method displays progress bar in UI thread.
         */
        @Override
        protected void onPreExecute() {
            progressBar.bringToFront();
            progressBar.setVisibility(View.VISIBLE);
        }

        /**
         * This method executes your bot calculation in background thread.
         */
        @Override
        protected Void doInBackground(Void... params) {
            //  put your bot calculation code here
        }

        /**
         * This method removes progress bar from UI thread when calculation is over.
         */
        @Override
        protected void onPostExecute(Void response) {
            progressBar.setVisibility(View.INVISIBLE);

        }
    }
}

См. AsyncTask здесь: https://stackoverflow.com/a/9671602/9626373

0 голосов
/ 06 июня 2018

Пара вещей:

используйте Tools-> LayoutInspector, чтобы увидеть, находится ли ваш индикатор выполнения в иерархии представления.Также см. Z-порядок может быть под другим видом.Я обычно добавляю полноэкранный относительный шаблон макета и индикатор выполнения внутри него, чтобы касания не допускались в то время, когда индикатор выполнения виден из макета.Таким образом, я уверен в z-порядке моего индикатора выполнения.Как последний элемент моего макета:

<RelativeLayout
    android:id="@+id/progress_bar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone">
    <ProgressBar style="@style/yourStyle"/></RelativeLayout>

Переключить видимость контейнера

...