我有一个非常简单的活动,它将自定义日期时间字符串打印到textView。我自己在MainActivity中实现了一个runnable接口,并在Thread
方法的末尾创建了一个onCreate
。
Thread thread = new Thread(this);
thread.run();
这是运行方法
public void run() {
while (true) {
try {
Thread.sleep(1000);
localTime.setText(LocalTime.getTime().format2445());
System.out.println(LocalTime.getTime().format2445());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当我在模拟器上运行它时,我可以在logcat中看到系统输出。但模拟器在大约5秒后显示ANR。我究竟做错了什么。这种方法不合适吗?是异步任务是什么方式去这里?我需要每秒更新一次时钟,因此永远运行AsyncTask是一种可接受的模式吗?
答案 0 :(得分:3)
我需要每秒更新一次时钟,因此运行AsyncTask 永远是一种可以接受的模式?
不,不建议这样做。根据{{3}},这些应该只运行很短的时间。我建议您使用AsyncTask Documentation和Timer进行此操作。
Timer timer;
public void onStart() {
timer = new Timer();
//this will update each second
timer.scheduleAtFixedRate(new UpdateTask(), 0,1000);
}
class UpdateTask extends TimerTask {
public void run() {
//update TextView
}
}
public void onStop(){
timer.cancel();
}
答案 1 :(得分:2)
尝试这样的事情。
new Thread(new Runnable() {
public void run() {
Thread.sleep(1000);
localTime.setText(LocalTime.getTime().format2445());
System.out.println(LocalTime.getTime().format2445());
}
}).start();
答案 2 :(得分:2)
可能你需要使用thread.start()而不是thread.run()
thread.start创建一个新线程并在新线程中运行您的代码。
thread.run在父线程中运行您的代码,不创建新线程
答案 3 :(得分:2)
您需要启动thread.start()
http://developer.android.com/reference/java/lang/Thread.html
从文档引用
有两种方法可以在新线程中执行代码。您既可以继承Thread并重写其run()方法,也可以构造一个新的Thread并将Runnable传递给构造函数。 在任何一种情况下,都必须调用start()方法来实际执行新的线程。。
您正在呼叫thread.run()
。你也叫睡觉。你不应该阻止ui线程。
http://developer.android.com/training/articles/perf-anr.html
如果您正在寻找倒计时器
http://developer.android.com/reference/android/os/CountDownTimer.html
Countdowntimer in minutes and seconds
您还可以使用处理程序,计时器任务。如果您使用计时器任务,请确保在ui线程上使用ui。
编辑:我没注意到这一点。所以从上面的评论。积分给DoctorDrive
localTime.setText(LocalTime.getTime().format2445()); // update ui from thread is not possible
您需要使用runOnUiThread
runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
localTime.setText(LocalTime.getTime().format2445());
}
});
答案 4 :(得分:1)
这是因为你在UI线程中调用了sleep。 不要在UI线程中调用sleep。 您可以使用Handler在UI线程上运行东西。
private static final Handler handler = new Handler();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
handler.postDelayed(textRunnable, 1000);
}
private final Runnable textRunnable = new Runnable() {
@Override
public void run() {
localTime.setText(LocalTime.getTime().format2445());
System.out.println(LocalTime.getTime().format2445());
}
}
或者你可以做到这一点,但不好的方式
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(LocalTime.getTime().format2445());
runOnUiThread(new Runnable() {
@Override
public void run() {
localTime.setText(LocalTime.getTime().format2445());
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}