2015-04-06 82 views
0

我正在爲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)的開始。但是如果它沒有被註釋掉,那麼微調者就不會顯示。

任何人都可以指出我做錯了什麼嗎?

回答

0

我重新實現我的代碼做長時間運行的操作使用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(); 
0

進展微調過程中長時間運行的操作

由於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

相關問題