长时间运行时未显示进度微调器

问题描述:

我正在为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的线程终止

使用AsyncTaskrunOnUiThread背景

+0

好的,我以前将长时间运行的操作移动到单独的线程,以便它不会阻止UI线程。不会将它更改为AsyncTask给我同样的问题,我需要等待完成? – Opus1217 2015-04-06 13:57:08

+0

@ 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

+0

我尝试了几个你建议的变体,但没有一个变化。但是,现在我已经重新实现为AsyncTask,并通过将所有后任务UI工作推入onPostExecute方法来获得所需的行为。看到我的答案。 – Opus1217 2015-04-06 18:17:00