簡體   English   中英

如何暫停但不凍結Android執行?

[英]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() (在ViewHandler )將允許您在延遲之后調度將在主應用程序線程上運行的代碼,而不會在該延遲期間占用主應用程序線程。

創建一個單獨的線程來執行暫停和運行。 從該線程發布消息到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM