2011-04-06 91 views
0

我只是想不断更新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); 
    } 
} 

任何人都可以看出错误?

问候和thx!

回答

2

考虑您不需要启动任何额外的线程来更新UI每x毫秒。一个附加螺纹的额外开销是合理的,如果你有时间密集型任务。在下面的例子中,按钮点击启动计时器。请注意,此代码不会创建新线程。

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

您无法从另一个线程更新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有关该

0

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