Android,创建一个简单的线程,将更新我的秒计数器

时间:2011-03-20 22:11:49

标签: android multithreading ui-thread

基本上,我正在尝试运行秒计数器和水平计数器。每10秒我想要++级别 但是到目前为止还没有实现,到目前为止我只是试图显示秒数,但我得到运行时异常和崩溃。
谷歌搜索我看到它,因为我试图从我的线程更新UI,这是不允许的。 所以我想我将需要asyncTask,但我不知道如何用我简单的小程序做到这一点。请帮忙或给我一些替代方案......

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

3 个答案:

答案 0 :(得分:6)

在UI线程中创建一个Handler,然后在worker线程中向处理程序发送一条消息(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.

答案 1 :(得分: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()的初始时间开始。 ()。

答案 2 :(得分:1)

使用AsyncTask和带有postDelayed方法的Handler构建了一个很棒的example计时器。

你是正确的,从后台更新用户界面是禁忌。