我想在循环中更新TextView
或Button
,因为会发生一些变化。但这引发了一个例外。
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();
}
为什么代码会抛出异常?
答案 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
!