2013-07-31 52 views
2

我有一个非常简单的活动,它将自定义日期时间字符串输出到textView。我在MainActivity中自己实现了一个可运行接口,并在onCreate方法的末尾创建了Thread在MainActivity中实现Runnable

Thread thread = new Thread(this); 
thread.run(); 

这是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永远运行是可接受的模式?

+2

你需要调用。 'thread.start()'。 – Raghunandan

+0

你想做什么?实现一个'CountDownTimer'? – gunar

+0

也,'localTime'是一个'TextView'? – gunar

回答

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()); 

       } 
      }); 
+0

谢谢Raghunandan,:-)我不能接受你的答案,但我必须等待7分钟。再次感谢 – DevZer0

+0

@ DevZer0没有任何问题,它的论坛规则。你必须等待几分钟。 – Raghunandan

2

尝试类似这样的事情。

new Thread(new Runnable() { 
public void run() { 
    Thread.sleep(1000); 
    localTime.setText(LocalTime.getTime().format2445()); 
    System.out.println(LocalTime.getTime().format2445()); 
} 
}).start(); 
2

可能需要使用thread.start()代替thread.run()

thread.start创建一个新线程,并运行在一个新的线程代码。

thread.run运行在父线程代码,不创建一个新的线程

3

我需要更新时钟每秒所以具有的AsyncTask运行 永远是一个可以接受的模式?

不,不建议这样做。根据AsyncTask Documentation,这些应该只能运行很短的时间。我建议你为此使用TimerTimerTask

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

这是因为你在UI线程中调用睡眠。 永远不要在UI线程中调用睡眠。 您可以使用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(); 
}