我只想在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);
}
}
有人能发现错误吗?
问候和感谢!
答案 0 :(得分:2)
您无法从其他线程更新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();
BTW - Thread.currentThread().sleep(100);
的使用可以缩短为Thread.sleep(100)
,因为它是静态方法。关于那个
答案 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。您的设计将以这种方式更具可扩展性。