2010-11-06 214 views
35

基本上,我需要暫停(基於幾秒鐘)才能將其放入一個操作中,以便用戶可以看到在執行下一個操作之前會發生什麼。所以對於二十一點,輪到經銷商時,他決定擊中,他命中,一張牌被添加,然後他決定下一步該做什麼。因此,在決定下一步做什麼之前,我希望代碼暫停,以便可以「看到」經銷商以這種方式進行的操作,莊家不會在一秒鐘內完成自己的操作,並且玩家只能看到結果。如何讓代碼在android中暫停幾秒鐘?

提前致謝!

我應該注意我已經嘗試使用等待(插入數字在這裏);但我被日食告知,它會導致堆棧攔截錯誤或類似的東西,並拋出一個異常,因此什麼都不做:(

嗯,這很有趣,(我編程的方式是「有趣的」至少說)我做了Thread.sleep(5000)並把它扔到try catch下面,它會休眠5秒,然後繼續執行代碼。但是,只有按下按鈕後纔會顯示視圖的更新(難道真的恨事件驅動編程)

回答

93

學習思考的事件而言確實是這裏的關鍵,您可以做到這一點:)

的第一條規則是:永遠不要拖延UI線程。 UI線程負責保持您的應用程序的響應。你在那裏做的任何工作都不應該阻止;盡你所能去做並儘快回覆。絕對避免在UI線程上執行I/O操作。 (有一些地方,你不能真正幫助它因生命週期的要求,例如節省應用狀態。)如果你曾經 UI線程上調用Thread.sleep你做錯了。

的Android強制執行此與「應用程序沒有響應」(或「ANR」)錯誤用戶看到。每當你在Android應用程序中看到它時,這意味着開發者做了一些事情導致UI線程停頓太久。如果設備由於某種原因真的陷入困境,這個錯誤可能實際上並不是應用程序開發者的錯,但通常這意味着該應用程序出錯了。

您可以通過發佈自己的活動來使用此模型。這給你一個簡單的方式來告訴你的應用,「稍後再做」。在Android中發佈您自己的活動的關鍵在Handler類。方法postDelayed可以讓您安排Runnable,它將在一定的毫秒數後執行。

如果你有一個看起來像這樣的活動:創建活動,則5秒後

public class MyActivity extends Activity { 
    private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mHandler.postDelayed(new Runnable() { 
      public void run() { 
       doStuff(); 
      } 
     }, 5000); 
    } 

    private void doStuff() { 
     Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show(); 
    } 
} 

,你會看到在doStuff創建的敬酒。

如果你正在寫一個自定義的View那就更簡單了。視圖有自己的postDelayed方法,可以將所有內容發佈到正確的Handler,而且您不需要創建自己的。

第二條規則是:視圖應該只有在UI線程上被修改。那些你得到和忽略的例外意味着出了問題,如果你忽略它們,你的應用程序可能會以有趣的方式開始行爲不端。如果您的應用程序在其他線程中執行大部分工作,則可以將post事件直接發送到要修改的視圖,以便修改能夠正確運行。

如果您從代碼的該部分引用了您的Activity,則還可以使用Activity#runOnUIThread,這正如其名稱所暗示的。如果張貼到單個視圖在上下文中沒有意義,您可能更喜歡這種方法。

至於更新視圖纔會出現,直到您按下按鈕,這些視圖是什麼樣的?他們是否正在繪製這些更新的自定義視圖?如果是這樣,你是否記得在數據更改後調用invalidate來觸發重繪?視圖僅在其失效後重新繪製。

+0

那麼看到我的方式的錯誤是,我試圖修改在不斷運行的不同線程的視圖,以便UI不會鎖定...因爲我不知道如何通過由我運行的線程生成的值...傳遞給UI。雖然令人難以置信的有幫助,但我非常感謝您的支持 – 2010-11-06 22:03:21

+0

使用AsyncTask – Falmarri 2010-11-07 07:23:55