在 long-运行 操作期间不显示进度微调器
Progress spinner not showing during long-running operation
我正在为 android 编写一个纸牌游戏应用程序。有时电脑播放器可能需要 1-3 秒才能播放,在此期间我想显示圆形不确定微调器。问题是微调器在此 "thinking" 时间内不显示,尽管它在测试中显示。
这是我的微调器片段:
<ProgressBar
android:id="@+id/progressCircle"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/draw_and_discard_piles"
android:layout_centerHorizontal="true"
android:visibility="gone"/>
以及在 OnCreate 期间对其进行膨胀的相应代码片段:
spinner = (ProgressBar)findViewById(R.id.progressCircle);
spinner.setVisibility(View.GONE);
并显示它:
void showSpinner(final boolean show) {
spinner.setVisibility(show ? View.VISIBLE : View.GONE);
spinner.invalidate();
}
在长时间 运行 播放期间,我执行以下操作,其中 DiscardOrDrawThread 是一个内部 class:
//if Computer, we decide here whether to draw or discard
final long playerStartTime = System.currentTimeMillis();
class DiscardOrDrawThread extends Thread {
private Game.PileDecision pickFrom;
DiscardOrDrawThread() {
pickFrom = null;
}
@Override
public void run() {
pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
}
}
DiscardOrDrawThread discardOrDrawThread = new DiscardOrDrawThread();
myActivity.showSpinner(true);
try {
discardOrDrawThread.start();
discardOrDrawThread.join();
}catch(RuntimeException e) {
System.out.println("takeTurn: thread join RuntimeException");
}catch (InterruptedException e) {
throw new RuntimeException("Interrupted in takeTurn");
}
myActivity.showSpinner(false);
实际播放代码运行良好,如果我注释掉 myActivity.showSpinner(false),则微调器将正确显示,从 long-运行 部分的开头开始(tryDiscardOrDrawPile)。但如果不注释掉,微调器永远不会显示。
任何人都可以指出我做错了什么吗?
Progress spinner not showing during long-running operation
由于discardOrDrawThread.join();
Why?
discardOrDrawThread.join();
导致当前线程(main UI-Thread)暂停执行直到discardOrDrawThread的线程终止
使用AsyncTask or runOnUiThread在后台进行长运行操作
我使用 AsyncTask 重新实现了我的代码(许多帖子建议使用 ProgressBars),如下所示,现在一切正常。
class DiscardOrDrawTask extends AsyncTask<Void, Void, Game.PileDecision> {
@Override
protected Game.PileDecision doInBackground(Void... params) {
final Game.PileDecision pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
return pickFrom;
}
@Override
protected void onPreExecute() {
myActivity.showSpinner(true);
}
@Override
protected void onPostExecute(final Game.PileDecision pickFrom) {
myActivity.showSpinner(false);
myActivity.animateComputerPickUpAndDiscard(playerMiniHandLayout, pickFrom);
}
}
DiscardOrDrawTask discardOrDrawTask= new DiscardOrDrawTask();
discardOrDrawTask.execute();
我正在为 android 编写一个纸牌游戏应用程序。有时电脑播放器可能需要 1-3 秒才能播放,在此期间我想显示圆形不确定微调器。问题是微调器在此 "thinking" 时间内不显示,尽管它在测试中显示。
这是我的微调器片段:
<ProgressBar
android:id="@+id/progressCircle"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/draw_and_discard_piles"
android:layout_centerHorizontal="true"
android:visibility="gone"/>
以及在 OnCreate 期间对其进行膨胀的相应代码片段:
spinner = (ProgressBar)findViewById(R.id.progressCircle);
spinner.setVisibility(View.GONE);
并显示它:
void showSpinner(final boolean show) {
spinner.setVisibility(show ? View.VISIBLE : View.GONE);
spinner.invalidate();
}
在长时间 运行 播放期间,我执行以下操作,其中 DiscardOrDrawThread 是一个内部 class:
//if Computer, we decide here whether to draw or discard
final long playerStartTime = System.currentTimeMillis();
class DiscardOrDrawThread extends Thread {
private Game.PileDecision pickFrom;
DiscardOrDrawThread() {
pickFrom = null;
}
@Override
public void run() {
pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
}
}
DiscardOrDrawThread discardOrDrawThread = new DiscardOrDrawThread();
myActivity.showSpinner(true);
try {
discardOrDrawThread.start();
discardOrDrawThread.join();
}catch(RuntimeException e) {
System.out.println("takeTurn: thread join RuntimeException");
}catch (InterruptedException e) {
throw new RuntimeException("Interrupted in takeTurn");
}
myActivity.showSpinner(false);
实际播放代码运行良好,如果我注释掉 myActivity.showSpinner(false),则微调器将正确显示,从 long-运行 部分的开头开始(tryDiscardOrDrawPile)。但如果不注释掉,微调器永远不会显示。
任何人都可以指出我做错了什么吗?
Progress spinner not showing during long-running operation
由于discardOrDrawThread.join();
Why?
discardOrDrawThread.join();
导致当前线程(main UI-Thread)暂停执行直到discardOrDrawThread的线程终止
使用AsyncTask or runOnUiThread在后台进行长运行操作
我使用 AsyncTask 重新实现了我的代码(许多帖子建议使用 ProgressBars),如下所示,现在一切正常。
class DiscardOrDrawTask extends AsyncTask<Void, Void, Game.PileDecision> {
@Override
protected Game.PileDecision doInBackground(Void... params) {
final Game.PileDecision pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
return pickFrom;
}
@Override
protected void onPreExecute() {
myActivity.showSpinner(true);
}
@Override
protected void onPostExecute(final Game.PileDecision pickFrom) {
myActivity.showSpinner(false);
myActivity.animateComputerPickUpAndDiscard(playerMiniHandLayout, pickFrom);
}
}
DiscardOrDrawTask discardOrDrawTask= new DiscardOrDrawTask();
discardOrDrawTask.execute();