如何连续更新Textview

时间:2014-07-26 12:19:37

标签: android

我想在循环中更新TextViewButton,因为会发生一些变化。但这引发了一个例外。

public void random() 
{      
    Thread timer = new Thread(){
        public void run()
        {
            Random ran= new Random();                        
            {
                final int ranNum=ran.nextInt(8);        
                while (true)
                {
                    Update = (TextView) findViewById(R.id.UpdateStatus);
                    Update.setText(ranNum); // TODO Auto-generated method stub
                    Thread.Sleep(1000);
                }                   
            }
        }
    };                               
    timer.start();   
}

为什么代码会抛出异常?

5 个答案:

答案 0 :(得分:1)

您无法从后台线程更新UI组件。编写处理程序以更新TextView。

Handler RefreshHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {

            Update = (TextView) findViewById(R.id.UpdateStatus);
            Update.setText(msg);
        }
    };

在您的runnable中,您只需将您的消息发送给处理程序即可更新:

public void random() 
{      
Thread timer = new Thread(){
   public void run()
   {
       Random ran= new Random();                     
                {
            final int ranNum=ran.nextInt(8);        
           while (true)
           {
            RefreshHandler.sendMessage(msg);

            Thread.Sleep(1000);
               }                
    }
   }
};                                
timer.start();   
}

答案 1 :(得分:0)

尝试更新textview的处理程序:

Handler handler = new Handler();    
Runnable runnable = new Runnable() {
@Override
public void run() {
  //update your ui
  handler.postDelayed(this, 100);//this restarts the handler better to have some terminating condition
}
};
handler.postDelayed(runnable, 100);//starts the handler first time

答案 2 :(得分:0)

要编辑TextView,您需要在UI线程中运行代码,因此您需要考虑一个您不需要睡眠线程的设置(即不使用Thread.Sleep(1000); )。

你应该使用Handler和Runnable,使用handler.postDelayed方法(check http://developer.android.com/reference/android/os/Handler.html),每隔x毫秒将runnable中的代码发布到自身。

请注意,通过此设置,即使TextView无法访问(例如,用户已移至另一个活动),代码也将继续运行,因此请确保对此进行检查并创建停止条件(也许,通过使用在您的活动或片段的onResume / onPause中设置true / false的布尔变量isVisible)。

答案 3 :(得分:0)

Android是线程敏感的,你不能从任何其他线程更新UI线程android不会允许你这样做,这就是你的应用程序崩溃的原因。 尝试创建final Handler handler = new Handler(); 处理程序实例与单个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们queue.then试试这个

 `Thread timer = new Thread(){
   public void run()
   {
    Random ran= new Random();                     
  {
final int ranNum=ran.nextInt(8);        
  while (true)
  { 
handler.post(new Runnable() {
public void run() {
TUpdate = (TextView) findViewById(R.id.UpdateStatus);
Update.setText(ranNum); // TODO Auto-generated method stub
 Thread.Sleep(1000);

 }
 }
     }
   }
       };`

答案 4 :(得分:0)

你不能在android中使用while(true)! Android处理程序不允许您将操作置于循环中而无法从中循环出来。请使用Service