Android线程问题

Android线程问题,android,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 voi

我只想在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);
    }
}
有人能发现错误吗


您好,谢谢

无法从其他线程更新GUI。您可以使用
runOnUiThread
handler
更新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();

顺便说一句,使用
Thread.currentThread().sleep(100)
可以短接到Thread.sleep(100),因为它是一种静态方法。请参阅关于不能从其他线程更新GUI的说明。您可以使用
runOnUiThread
handler
更新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();

顺便说一句,使用
Thread.currentThread().sleep(100)
可以短接到Thread.sleep(100),因为它是一种静态方法。请参阅有关该

或使用的信息。它被设计用于执行后台任务并正确更新UI。这样,您的设计将更具可扩展性。

或使用。它被设计用于执行后台任务并正确更新UI。通过这种方式,您的设计将更具可扩展性。

请考虑,您不需要每隔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;
        }
    }
};
private Handler myHandler=new Handler(){
@凌驾
公共无效handleMessage(消息消息消息){
开关(msg.what){
案例0:
如果(!isDoneThinking){
editTextConfusedText.setText(“仍在思考”+新整数(thinkSeconds.toString());
thinkSeconds++;
此.removeMessages(0);

sendMessageDelayed(获取消息(0),1000)/请考虑,您不需要每隔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;
        }
    }
};
private Handler myHandler=new Handler(){
@凌驾
公共无效handleMessage(消息消息消息){
开关(msg.what){
案例0:
如果(!isDoneThinking){
editTextConfusedText.setText(“仍在思考”+新整数(thinkSeconds.toString());
thinkSeconds++;
此.removeMessages(0);
sendMessageDelayed(获取消息(0),1000)//