2011-03-11 48 views
4

我試圖根據一定的標準(如string =「a」或「b」)在指定的時間量內(在每個顏色開關之間暫停)設置ImageView的背景顏色。我的問題是,我似乎無法讓整個應用程序等待一個更改,直到它移動到下一個,所以對用戶來說,它看起來像顏色開始,然後立即是最後一個顏色。如何暫停但不凍結Android執行?

我試過CountDownTimers(這只是繼續與其他定時器運行時執行),處理器(postDelayed(空,5000)),Thread.Sleeps等

這裏是什麼我的例子努力做到:

設置顏色上的ImageView紅色
睡眠500ms的

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 
} 

我知道這有點瘋狂,但我已經嘗試了所有上述的方法我能想到的,但沒有成功上實際製作該程序等待,但不完全停止它。

謝謝。

回答

2

把這個在你的活動(使它成爲一個內部類):

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(); 

在任何地方你的活動。

+0

謝謝monoceres,也非常有幫助! – John 2011-03-11 18:21:24

+0

我結束了這個實現。這篇文章中的每個人都對今天的幫助非常大,我認爲我對線程有更好的掌握能力,現在就可以了。感謝大家。 – John 2011-03-11 21:16:08

2

創建一個單獨的線程來暫停和運行。從該線程向UI線程發送消息以更改其imageview的顏色。

+0

謝謝,我仍然在學習,所以我會進一步探討線索。我已經嘗試了一個帶有Runnable的Handler,它在ms允許後更新顏色,但沒有成功。如果您或其他人有任何額外的信息,請幫助張貼:)再次感謝 – John 2011-03-11 16:22:12

+0

這是你應該有的。活動中的處理程序。該處理程序應該能夠接收基於顏色變化的消息。在onPause中創建一個新的線程,該線程具有一個帶有Thread.sleep(ms)的控制語句的runnable,並使用'what'中的代碼將UIE線程的sendEmptyMessages發送到UI線程。處理程序管理其餘部分。 – 2011-03-11 16:26:01

+0

謝謝Ujwal,非常有幫助的信息。 – John 2011-03-11 18:21:00

3

在過去的二十年裏,大多數GUI都基於事件驅動模型。一些(如Android)使用單線程事件驅動模型。您更改顏色的請求不會立即生效;相反,它將消息放在工作隊列中,由主應用程序線程處理。除非您專門將該代碼移動到後臺線程,否則主應用程序線程也是運行您的代碼的部分。

因此,永遠不要睡在主應用程序線程上。否則,該線程會被捆綁,無法處理任何類型的GUI事件,更不用說您的請求來更改顏色。

postDelayed()(上ViewHandler)將允許你以調度代碼在主應用程序線程在未來的運行,延遲一段時間後,如果沒有延遲期間佔用主應用程序線程。

+0

謝謝,這有助於我瞭解更多的過程! – John 2011-03-11 18:19:22