2016-03-01 54 views
0

所以我有一個android應用程序,我希望減少一個值並將其顯示在textview中。我從1000開始,從1到1秒減1。如果你保持更高的水平,這將作爲一個時間減少的分數。這是我的代碼:實時更新textView(使用for)

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game); 
    timeText = (TextView) findViewById(R.id.textView5); 



    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      for(time=1000;time>=0;time--){ 
       try { 
        TimeUnit.SECONDS.sleep(1); 
          timeText.setText(String.valueOf(time)); 
          System.out.println(time); 

       } 


       catch(Exception e) 
       { 
        System.out.println("Error on delay"); 
       } 

      }} 
     }); 

} 

我的錯誤是,每當我進入這個活動,屏幕變成黑色。控制檯打印值從第二到第二,如果我評論「for」textView正確顯示值1000(如果我聲明int time = 1000當然)。我真的不確定這裏有什麼問題。有人知道我做錯了什麼嗎?

+0

爲什麼你讓線程睡眠,這是主要的原因和理由黑屏。嘗試使用Handler代替遞歸postdelay – UMESH0492

+0

使用計時器代替。 –

回答

0

您正在暫停該for循環中的用戶界面。

達到你想要的東西,無論是使用Handler

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //update textview here 
     } 
    },1000); 

OR

使用Timer

new Timer().scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      //update 
     } 
    },1000,0); 

我不知道很多有關處理程序,但你並不需要定時器中的for循環。

你的情況:

long time=1000; 

    new Timer().scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable(){ 
       timeText.setText(String.valueOf(time)) 
       time--; 
      }); 
     } 
    },1000,0).start(); 

好運

+0

那麼究竟應該如何使用定時器的代碼更新線程?我也必須使用UI線程內的計時器或外部它(我猜裏面)? –

+0

您可以在另一個線程內啓動計時器。只需將setText()方法放入runOnUiThread()中的timer的run()中即可。 不要忘記打電話給計時器 –

+0

上的開始(),它似乎仍然崩潰的應用程序,但現在我直接崩潰。你介意把代碼發給你的意思嗎? –

0

你不能像這樣在UI線程上循環。在Android內部,UI線程上有一個消息循環。當它需要繪製時,它會向該消息循環發送一條消息。在處理該消息之前,更改不會顯示在屏幕上。爲了處理消息,您的代碼必須完成並返回消息循環。

如果你想這樣做,你不能在UI線程上使用for循環。您需要將單個消息發送給每個您要製作的繪圖的處理程序。