學習思考的事件而言確實是這裏的關鍵,您可以做到這一點:)
的第一條規則是:永遠不要拖延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
來觸發重繪?視圖僅在其失效後重新繪製。
那麼看到我的方式的錯誤是,我試圖修改在不斷運行的不同線程的視圖,以便UI不會鎖定...因爲我不知道如何通過由我運行的線程生成的值...傳遞給UI。雖然令人難以置信的有幫助,但我非常感謝您的支持 – 2010-11-06 22:03:21
使用AsyncTask – Falmarri 2010-11-07 07:23:55