2011-03-20 21 views
6

基本上,我試圖運行一個秒計數器和一個計數器。每10秒我想要++級別。
但這還沒有實現,到目前爲止,我只是想獲得秒顯示,但我得到運行時異常和崩潰。
谷歌搜索我看到它,因爲我試圖從我的線程更新UI,這是不允許的。 所以我想我會需要asyncTask,但我不知道如何用我的簡單的小程序做到這一點。請幫助或者給我一些替代品...Android,創建一個簡單的線程,將更新我的秒計數器

package com.ryan1; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class main extends Activity { 

int level = 1; 
int seconds_running=0; 

TextView the_seconds; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    the_seconds = (TextView) findViewById(R.id.textview_seconds); 



    Thread thread1 = new Thread(){ 
     public void run(){ 
      try { 
       sleep(1000); Log.d("RYAN", " RYAN "); 

       updated_secs(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("RYAN", " "+e); 
      } 
     } 
    }; 
    thread1.start(); 
} 

public void updated_secs(){ 
    seconds_running++; 
    the_seconds.setText(" "+seconds_running); 
} 
} 

回答

6

在UI線程中創建一個處理程序,然後在工作線程中向處理程序發送消息(Handler.sendMessage(...))。

消息將在您的UI線程上處理,因此您可以正確更新文本窗口小部件。像這樣:

private Handler myUIHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if (msg.what == some_id_you_created) 
     { 
      //Update UI here... 
     } 
    } 
}; 

Then in your thread, to send a message to the handler you do this: 

Message theMessage = myHandler.obtainMessage(some_id_you_created); 
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler. 
+0

嘿!我們分享同一個名字:)請問你能給我一些示例代碼嗎?在這之後的幾個小時裏,我感覺腦子已經死了...... – Ryan 2011-03-20 22:57:06

+0

謝謝!會試試看! – Ryan 2011-03-21 00:08:28

1

有一個定時器的偉大example使用的AsyncTask,並與postDelayed方法的處理程序內置。

你是正確的,從後臺更新UI是一個禁忌。

+0

感謝您的回覆!我實際上看到了這一點,但我想通過線索來做到這一點,因爲我想學習線程,因爲我聽到它非常重要,因爲你在課上學習,最後來製作某種遊戲......你能幫我做些什麼嗎?這通過線程請? – Ryan 2011-03-20 22:22:31

+0

我也看不到這裏使用的AsyncTask任務 – 2011-08-16 20:10:42

3

對於這種事情,使用另一個線程是浪費;這只是一種浪費,因此你必須解決多線程問題。所以,應該使用Handler.sendDelayedMessage():

static final int MSG_DO_IT = 1; 
static final long TIME_BETWEEN_MESSAGES = 10 * 1000; // 10 seconds 

Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_DO_IT: { 

       // Update your UI here... 

       Message newMsg = obtainMessage(MSG_DO_IT); 
       sendMessageDelayed(newMsg, TIME_BETWEEN_MESSAGES); 
      } break; 
     } 
    } 
} 

@Override 
void onResume() { 
    super.onResume(); 

    // Start the timer, executing first event immediately. 
    Message newMsg = mHandler.obtainMessage(MSG_DO_IT); 
    mHandler.sendMessage(newMsg); 
} 

@Override 
void onPause() { 
    super.onPause(); 

    // Stop the timer. 
    mHandler.removeMessages(MSG_DO_IT); 
} 

注意,此實現會有一些漂移 - 消息之間的實際時間是TIME_BETWEEN_MESSAGES +(時間調度消息)。如果你需要一些不會漂移的東西,你可以通過使用Hander.sendMessageAtTime()來進行計時,並且每次都用一個常數值遞增新的時間,從onResume中獲得SystemClock.uptimeMillis()的初始時間開始()。

相關問題