2015-09-28 45 views
-1

使用Android工作室,我試圖製作一個應用程序,它從Web服務獲取數據並顯示數據並每5秒更新一次視圖,服務更改。有了這個,我試圖改變基於int,int改變一些按鈕上的顏色,當我將buttons();應用到另一個按鈕然後按下按鈕時,按鈕上的顏色會發生變化,但我希望它自己更新。如何讓runOnUiThread在Android中連續運行

當我用while循環中的應用程序卡住

MainActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      buttons(); 

     } 
    }); 

runOnUiThread被放置在onCreate

+1

這是不是一個好主意,用AlarmManager並配置它5秒和內部廣播接收器,你可以打電話給Web服務,並做你想做的事情在你的網絡服務回調你的網絡服務 – user1688181

回答

1

使用在UI線程上運行會導致您的UI凍結,請嘗試使用計時器任務。 例如:

@Override 
    public void StopTimerTask() { 
     if (timer != null) { 
      timer.cancel(); 
      timer = null; 
     } 
    } 

    public void StartTimer() { 
     timer = new Timer(); 
     initializeTimerTask(); 
     int UpdateTime = Integer.valueOf(UserSettings.getString("Update", "60000")); 
     timer.schedule(doAsynchronousTask, 0, YOURTIME); 
    } 
    public void initializeTimerTask() { 

     doAsynchronousTask = new TimerTask() { 
      @Override 
      public void run() { 
       myHandler.post(new Runnable() { 
        public void run() { 
         YOUR LOGIC HERE 
        } 
       }); 
      } 
     }; 

    } 
+0

和你打電話從OnCreate這3種方法? – kasper995

+0

我在OnCreate上調用StartTimerTask(),只要確保在任務需要停止時調用StopTimerTask(),例如onpause,以避免相關問題 –

0

這樣做,其中u只是把另一個類爲主要活動是成功的唯一的問題是,它必須在我的主類

public class updategui extends TimerTask { 
       Activity context; 
       Timer timer; 

       public updategui(Activity context, int seconds) { 
        this.context = context; 
        timer = new Timer(); 
        timer.schedule(this, 
          seconds * 1000, // initial delay 
          seconds * 1000); // subsequent rate 
       } 

       @Override 
       public void run() { 
        if(context == null || context.isFinishing()) { 
         this.cancel(); 
         return; 
     } 

     context.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 

       try { 
        buttons(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    }}