2015-09-28 51 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(); 
       } 
      } 
     }); 
    }}