我正在使用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
没有显示活动。如果错了,我怎么解决可能有问题?
答案 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