2016-05-06 192 views
-1

我想改變一個活動的背景(或更容易一個textview的背景)異步。設置android背景顏色async

顏色在間隔(這裏是500 MS)後應該改變。我無法通過異步類訪問視圖或textview。

有沒有辦法做到這一點?

private void setColor(int red, int yellow, int blue) { 
     View view = this.getWindow().getDecorView(); 
     view.setBackgroundColor(Color.rgb(red,yellow,blue)); 
    } 

    private class DisplayGradient extends AsyncTask<Clock, Void, Void> { 

     @Override 
     protected Void doInBackground(Clock... params) { 

      for(int i = 0; i < 10; ++i) { 
       try { 
        setColor(i*10,0,0); 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
       return null; 
     } 

回答

2

使用Activity.runOnUiThread

UI線程是唯一允許操作視圖的線程。


或者,使用View.postDelayed

view.postDelayed(new Runnable() { 
     int count = 0; 
     @Override 
     public void run() { 
      //do something on UI thread 
      if(count++ < 10) { 
       view.postDelayed(this, 500); 
      } 
     } 
    }, 500); 

這自動使用UI線程。

+0

先後在這樣: '@覆蓋 保護無效doInBackground(時鐘... PARAMS){ 爲( int i = 0; i <10; ++ i){finalId c = i * 10; (){ }); runOnUiThread(new Runnable(){ }); }); try {thread} thread(500); (InterruptedException e){ e.printStackTrace(); } }' – sampa

0

試試這個簡單的方法,而不是你的代碼。事情是這樣的

Handler handler = new Handler(); 

final Runnable r = new Runnable() { 
public void run() { 
    for(int i = 0; i < 10; ++i) { 
      try { 
       setColor(i*10,0,0); 
       Thread.sleep(500) 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
}; 

調用這一行,你要開始

handler.postDelayed(r, 500); 
+0

這段代碼會'發佈'runnable在同一時刻觸發10次。 – F43nd1r

+0

@ F43nd1r代碼已更新。完成for循環後,runnable將觸發 – Masum

+0

那麼,現在代碼會產生無限'postDelayed'calls。 – F43nd1r