Java 为什么我的应用程序在更新方法中设置文本时强制关闭?
我有一个android应用程序,我只是在做实验,我似乎不明白为什么当我通过while循环更新TextView时,我的应用程序强制关闭。当我注释掉updateText方法时,它运行良好Java 为什么我的应用程序在更新方法中设置文本时强制关闭?,java,android,textview,Java,Android,Textview,我有一个android应用程序,我只是在做实验,我似乎不明白为什么当我通过while循环更新TextView时,我的应用程序强制关闭。当我注释掉updateText方法时,它运行良好 public class GameThread extends Thread { Thread t; private int i; private boolean running; private long sleepTime; GameView gv; public GameThread(
public class GameThread extends Thread {
Thread t;
private int i;
private boolean running;
private long sleepTime;
GameView gv;
public GameThread() {
t = new Thread(this);
t.start();
i = 0;
sleepTime = 1000;
}
public void initView(GameView v) {
this.gv = v;
}
public void setRunning(boolean b) {
this.running = b;
}
public boolean getRunning() {
return running;
}
public void run() {
while(running) {
i++;
update();
try {
t.sleep(sleepTime);
} catch(InterruptedException e) {
}
}
}
public void update() {
gv.setText(i); // when this is uncommented, it causes force close
Log.v("Semajhan", "i = " + i);
}
public class GameView extends LinearLayout {
public TextView tv;
public GameView(Context c) {
super(c);
this.setBackgroundColor(Color.WHITE);
tv = new TextView(c);
tv.setTextColor(Color.BLACK);
tv.setTextSize(20);
this.addView(tv);
}
public void setText(int i) {
tv.setText("i count: " + i);
}
public class Exp extends Activity {
GameThread t;
GameView v;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
v = new GameView(this);
setContentView(v);
t = new GameThread();
t.setRunning(true);
t.initView(v);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (t.getRunning() == true) {
t.setRunning(false);
Log.v("Semajhan", "STOPPED");
} else {
t.setRunning(true);
Log.v("Semajhan", "RESTART");
}
}
return true;
}
protected void onDestroy() {
Log.v("Semajhan", "DESTROYING");
super.onDestroy();
}
protected void onStop() {
Log.v("Semajhan", "Stopping");
super.onStop();
}
我想我会发布整个应用程序,因为它相对较小,因此我可以在不混淆的情况下获得一些帮助。您必须从UI线程调用它 有关详细信息,请查看: 如果您决定使用处理程序,最简单的解决方案是:
onDraw
,在其中绘制游戏对象,当然,在您首先为它们计算游戏数据之后private Handler playHandler=new Handler(){
public void handleMessage(Message msg){
}
}代码>
换句话说,视图负责绘图(您可以在单独的类中移动计算,并在onDraw之前调用它),线程只负责调度对处理程序的调用,处理程序只负责告诉视图重新绘制自己。您必须从UI线程调用它 有关详细信息,请查看: 如果您决定使用处理程序,最简单的解决方案是:
onDraw
,在其中绘制游戏对象,当然,在您首先为它们计算游戏数据之后private Handler playHandler=new Handler(){
public void handleMessage(Message msg){
}
}代码>
换句话说,视图负责绘图(您可以在单独的类中移动计算,并在onDraw之前调用它),线程只负责调度对处理程序的调用,处理程序只负责通知视图重新绘制自身。您不能在UI线程之外更新应用程序的UI,哪一个是您开始的“主”线程。在应用程序的onCreate(Context)中,您正在创建游戏线程对象,这就是更新UI的目的 您应该使用处理程序:
您不能在UI线程之外更新应用程序的UI,UI线程是您启动的“主”线程。在应用程序的onCreate(Context)中,您正在创建游戏线程对象,这就是更新UI的目的 您应该使用处理程序:
首先,当您获得一个强制关闭对话框时,使用Eclipse中的adb logcat、DDMS或DDMS透视图检查logcat并查看与崩溃相关的堆栈跟踪 在这种情况下,您的异常将导致“无法从非UI线程修改用户界面”。您正试图从后台线程调用
setText()
,这是不受支持的
如果您使用的是2D/3D图形,那么使用
游戏线程
是有意义的。对于基于小部件的应用程序,它不是一种合适的模式。有、、个示例演示了如何在不使用游戏线程的情况下创建基于小部件的应用程序。首先,当您获得一个强制关闭对话框时,使用Eclipse中的adb logcat、DDMS或DDMS透视图来检查logcat并查看与崩溃相关的堆栈跟踪
在这种情况下,您的异常将导致“无法从非UI线程修改用户界面”。您正试图从后台线程调用setText()
,这是不受支持的
如果您使用的是2D/3D图形,那么使用
游戏线程
是有意义的。对于基于小部件的应用程序,它不是一种合适的模式。有,,个示例演示了如何在不使用游戏线程的情况下创建基于小部件的应用程序。我对编程比较陌生,但如果您能以最简单的形式演示处理程序的使用,是否可能?如果你知道我的意思的话,我更像是一个视觉尝试失败重复学习者。哦,谢谢你提供的信息。我对编程比较陌生,但如果您能以最简单的形式演示处理程序的使用,是否可能?如果你知道我的意思的话,我更像是一个视觉尝试失败重复学习者。所以从长远来看,我应该使用操纵器还是不使用?正如你所建议的那样,但我现在得到了一件事。我创建了一个带有活动和扩展线程类的简单应用程序。现在,我在活动中创建了一个处理程序和一个线程实例,并启动它。我的活动中还有一个启动线程的按钮,用于更新按钮的文本。这就是我被卡住的地方。我应该如何连接处理程序?我添加了Message.get(handler.sendToTarget();在我的thread类中,它说处理程序不能解析为变量。所以为了长期的利益,我应该使用处理程序还是不使用?正如你所建议的那样,但我现在得到了一件事。我创建了一个带有活动和扩展线程类的简单应用程序。现在,我在活动中创建了一个处理程序和一个线程实例,并启动它。我的活动中还有一个启动线程的按钮,用于更新按钮的文本。这就是我被卡住的地方。我应该如何连接处理程序?我添加了Message.get(handler.sendToTarget();在我的thread类中,但它说处理程序不能解析为变量。我将使用2D/3D图形。这些小部件和诸如此类的东西只是做一些非常简单的测试。我将使用2D/3D图形。这些小部件和诸如此类的东西只是做一些非常简单的测试。
gameView.postInvalidate(); // gameView is the View that you extended