将ProgressBar添加到活动以显示计算

时间:2018-06-06 06:48:58

标签: java android view android-progressbar

我正在使用Android Studio在Android设备上构建一个奥赛罗游戏(类似于Go游戏)。

我使用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使用是对还是错?如果正确,为什么progress_bar没有显示活动。如果错了,我怎么解决可能有问题?

2 个答案:

答案 0 :(得分:0)

一些事情:

使用工具 - > LayoutInspector,用于查看进度条是否在视图层次结构中。 另见z-order可能是另一种观点。 我通常会在其中添加一个全屏相对布局稀松布和进度条,以便在布局中可以看到进度条时不允许点击。这样我确信我的进度条的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>

切换容器的可见性

答案 1 :(得分:0)

尝试将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