2013-07-31 53 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(); 
}