长时间运行时未显示进度微调器
问题描述:
我正在为Android编写一款卡片播放应用程序。有时电脑玩家可以玩1-3分钟,在这段时间内,我想展示圆形的不确定旋钮。问题在于,在这个“思考”时间里,微调者并没有表现出来,尽管它在测试中表现出来。长时间运行时未显示进度微调器
这里是我的微调片段:
<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是一个内部类:
//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(假),那么微调将正确显示出来,开始长期运行的部分(tryDiscardOrDrawPile)的开始。但是如果它没有被注释掉,那么微调者就不会显示。
任何人都可以指出我做错了什么吗?
答
我重新实现我的代码做长时间运行的操作使用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();
答
进展微调过程中长时间运行的操作
由于discardOrDrawThread.join();
为什么不显示?
discardOrDrawThread.join();
导致当前线程(主UI线程)暂停执行,直到discardOrDrawThread的线程终止
好的,我以前将长时间运行的操作移动到单独的线程,以便它不会阻止UI线程。不会将它更改为AsyncTask给我同样的问题,我需要等待完成? – Opus1217 2015-04-06 13:57:08
@ Opus1217:删除'discardOrDrawThread.join();'并且这样做:'@Override public void run(){ pickFrom = tryDiscardOrDrawPile(isFinalTurn,deck.discardPile.peekNext(),deck.drawPile.peekNext() ); myActivity.runOnUiThread(新的Runnable(){ @Override 公共无效的run(){ myActivity.showSpinner(假); } }); }' – 2015-04-06 13:59:19
我尝试了几个你建议的变体,但没有一个变化。但是,现在我已经重新实现为AsyncTask,并通过将所有后任务UI工作推入onPostExecute方法来获得所需的行为。看到我的答案。 – Opus1217 2015-04-06 18:17:00