我的计时器出了问题。 2秒后而不是这个动作我收到一个错误。
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = (TextView)findViewById(R.id.tv);
Timer timer=new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
tv.setText("why?");
}
};
timer.schedule(timerTask,2000);
}
}
如何解决这个问题?
答案 0 :(得分:1)
您无法从非主线程
运行这些 @Override
public void run() {
tv.setText("why?");
}
您必须使用runOnUiThread
@Override
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
tv.setText("why?");
}});
}
}
或使用View的post方法
@Override
public void run() {
tv.post(new Runnable(){
@Override
public void run() {
tv.setText("why?");
}});
}
}
我知道它看起来很奇怪,但如果你用lambdas写它就会更好更简洁
timer.schedule(()->{tv.post(()->{setText("why?");}},2000);
答案 1 :(得分:0)
您无法从线程内更新UI。从主线程更新UI。
创建处理程序并在完成工作后向处理程序发送消息并更新UIthere。
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// Update UI
}
};
并使用handler.sendMessage()