Android线程问题

时间:2011-04-06 11:47:38

标签: android

我只想在Android应用中不断更新文字。但是我的应用程序每次都崩溃了。

这是我的代码:

package org.pgvw.main;

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

public class InertialView extends Activity {
    TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv = new TextView(this);
        tv.setText("Time: ");
        new Thread(new Runnable() {
            public void run() {
                while(true) {
                    try {
                        Thread.currentThread().sleep(100);
                        tv.setText("Time: " + System.currentTimeMillis());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        setContentView(tv);
    }
}

有人能发现错误吗?

问候和感谢!

3 个答案:

答案 0 :(得分:2)

您无法从其他线程更新GUI。您可以使用runOnUiThreadhandler更新GUI。

例如:

new Thread(new Runnable() {
            public void run() {
                while(true) {
                    try {
                        Thread.currentThread().sleep(100);
                        runOnUiThread(new Runnable() {
                            public void run() {
                                tv.setText("Time: " + System.currentTimeMillis());
                            }

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

BTW - Thread.currentThread().sleep(100);的使用可以缩短为Thread.sleep(100),因为它是静态方法。关于那个

,请参阅Jon Skeet's answer

答案 1 :(得分:2)

考虑到您不需要每隔x毫秒启动任何其他线程来更新UI。如果您有时间密集型任务,则添加线程的额外开销是合理的。在以下示例中,按钮单击启动计时器。请注意,此代码不会创建新线程。

private Handler myHandler= new Handler(){
    @Override
    public void  handleMessage(Message msg){         
        switch(msg.what){
            case 0:
                if (!isDoneThinking){
                    editTextConfusedText.setText("Still Thinking "+new Integer(thinkSeconds).toString());
                    thinkSeconds++;
                    this.removeMessages(0);
                    sendMessageDelayed(obtainMessage(0),1000); // <== Loop on delayed messages every second
                }
                else {
                    thinkSeconds= 0; // reset timer
                }
                break;
            default:
                super.handleMessage(msg);
                break;
        }
    }
};

我们在onClick中启动计时器。我们只是发送一个空值消息,其值为“0”。

    buttonConfuseText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

               isDoneThinking= false;
               myHandler.sendEmptyMessage(0); <== starts timer with what value of "0"
        }
    };

计时器不受约束并将继续计数,直到标志isDoneThinking设置为true。

答案 2 :(得分:0)

或使用AsyncTask。它旨在执行后台任务并正确更新UI。您的设计将以这种方式更具可扩展性。