[英]How to pause but not freeze Android execution?
我正在嘗試根據特定條件(例如string =“a”或“b”)在指定的時間內(在每次顏色切換之間暫停)設置ImageView的背景顏色。 我的問題是我似乎無法使整個應用程序等待一個更改,直到它繼續下一個,所以對於用戶它看起來像顏色開始然后立即是最后一個顏色。
我已經嘗試過CountDownTimers(在其他計時器運行時繼續執行),處理程序(postDelayed(null,5000)),Thread.Sleeps等。
這是我正在嘗試做的一個例子:
將ImageView上的顏色設置為紅色
睡500碼
for(int i = 0; i < stringArray.length; i++){
if(stringCompare = "a") {
Set color on ImageView to blue
sleep for 500ms }
else if(stringCompare = "b") {
Set color on ImageView to blue
sleep for 1000ms
}
Set color on ImageView to red
sleep for 500ms
}
我知道這有點瘋狂,但我已經嘗試了所有上述方法,我認為沒有成功實際讓程序等待,但沒有完全停止它。
謝謝。
在過去的二十年中,大多數GUI都基於事件驅動模型。 某些(如Android)使用單線程事件驅動模型。 您更改顏色的請求不會立即生效; 相反,它將消息放在工作隊列上,由主應用程序線程處理。 該主應用程序線程也是運行代碼的,除非您專門將該代碼移動到后台線程。
因此,永遠不要在主應用程序線程上休眠。 否則,該線程被綁定並且無法處理任何類型的GUI事件,更不用說更改顏色的請求了。
postDelayed()
(在View
或Handler
)將允許您在延遲之后調度將在主應用程序線程上運行的代碼,而不會在該延遲期間占用主應用程序線程。
創建一個單獨的線程來執行暫停和運行。 從該線程發布消息到UI線程以更改其imageview的顏色。
把它放在你的活動中(把它變成一個內部類):
private class ColorChanger extends Thread
{
final ImageView imageView;
public ColorChanger(ImageView imageView)
{
this.imageView = imageView;
}
private void changeColor(final int color)
{
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
// Set imageView to color here
}
});
}
@Override
public void run() {
try {
Thread.sleep(500);
changeColor(0xffff0000);
Thread.sleep(500);
changeColor(0xff0000ff);
// Etc.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后你可以這樣做:
new ColorChanger(/*Your imageview*/).start();
活動中的任何地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.