在MainActivity中实现Runnable

时间:2013-07-31 14:46:27

标签: android

我有一个非常简单的活动,它将自定义日期时间字符串打印到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是一种可接受的模式吗?

5 个答案:

答案 0 :(得分:3)

  

我需要每秒更新一次时钟,因此运行AsyncTask   永远是一种可以接受的模式?

不,不建议这样做。根据{{​​3}},这些应该只运行很短的时间。我建议您使用AsyncTask DocumentationTimer进行此操作。

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。

Android Thread for a timer

编辑:我没注意到这一点。所以从上面的评论。积分给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();
}