Android线程问题
我只想在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
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)//