Java 更新TextView时,带有scheduleAtFixedRate的计时器和TimerTask会导致CalledFromErrorThreadException崩溃
我是Android编程新手。现在,我想以指定的间隔更新Java 更新TextView时,带有scheduleAtFixedRate的计时器和TimerTask会导致CalledFromErrorThreadException崩溃,java,android,timer,Java,Android,Timer,我是Android编程新手。现在,我想以指定的间隔更新活动中的文本视图值 车辆等级: public class Car { public int Speed; public int RPM; public int Distance; public int Fuel; public Car(int Speed, int RPM, int Distance, int Fuel) { System.out.println(
活动
中的文本视图
值
车辆等级:
public class Car {
public int Speed;
public int RPM;
public int Distance;
public int Fuel;
public Car(int Speed, int RPM, int Distance, int Fuel) {
System.out.println(
"Inisialisasi Baru"+
"\nSpeed: "+ Speed +
"\nRPM: "+ RPM +
"\nDistance: "+ Distance +
"\nFuel: "+ Fuel
);
this.Speed = Speed;
this.RPM = RPM;
this.Distance = Distance;
this.Fuel = Fuel;
}
public int getSpeed() {
return Speed;
}
public int getRPM() {
return RPM;
}
public int getDistance() {
return Distance;
}
public int getFuel() {
return Fuel;
}
}
java活动:
TextView carSpeed, carRPM, carDistance, carFuel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mock);
carSpeed = (TextView) findViewById(R.id.carSpeed);
carRPM = (TextView) findViewById(R.id.carRPM);
carDistance = (TextView) findViewById(R.id.carDistance);
carFuel = (TextView) findViewById(R.id.carFuel);
new Timer().scheduleAtFixedRate(new TimerTask(){
Car car = new Car(20, 20, 20, 5);
@Override
public void run(){
int maxSpeed = car.Speed + 5;
int minSpeed = car.Speed - 4;
int maxRPM = car.RPM + 5;
int minRPM = car.RPM - 4;
car.Speed = new Random().nextInt((maxSpeed - minSpeed) + 1) + minSpeed;
car.RPM = new Random().nextInt((maxRPM - minRPM) + 1) + minRPM;
car.Distance += 1;
car.Fuel -= 1;
if (car.Fuel <= 0) {
car.Fuel += 20;
}
if (car.Speed <= 0) {
car.Speed = 20;
} else if (car.Speed >= 150) {
car.Speed -= 50;
}
carSpeed.setText(Integer.toString(car.getSpeed()) + " km/h");
carRPM.setText(Integer.toString(car.getRPM()) + " rpm");
carDistance.setText(Integer.toString(car.getDistance()) + " km");
carFuel.setText(Integer.toString(car.getFuel()) + " l");
}
},0,5000);
}
TextView车速、carRPM、carDistance、carFuel;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mock);
carSpeed=(TextView)findViewById(R.id.carSpeed);
carRPM=(TextView)findViewById(R.id.carRPM);
CardInstance=(TextView)findViewById(R.id.CardInstance);
carFuel=(TextView)findViewById(R.id.carFuel);
新计时器().scheduleAtFixedRate(新计时器任务()){
轿车=新车(20,20,20,5);
@凌驾
公开募捐{
int maxSpeed=汽车速度+5;
int分钟速度=汽车速度-4;
int maxRPM=car.RPM+5;
int minRPM=car.RPM-4;
car.Speed=new Random().nextInt((maxSpeed-minSpeed)+1)+minSpeed;
car.RPM=new Random().nextInt((maxRPM-minRPM)+1)+minRPM;
车距+=1;
汽车燃料-=1;
如果(car.Fuel是,您的直觉是正确的。问题的发生是因为视图正在从计时器更新
错误将类似于此:
android.view.ViewRootImpl$CalledFromErrorThreadException:只有
创建视图层次结构的原始线程可以接触其视图
在Android中,视图只能从“UI线程”更新,也就是通常所说的“主线程”
这里的问题是Runnable的run()方法正在一个单独的线程中执行
可以通过以下活动在主线程上进行更新:
...
runOnUiThread(new Runnable() {
@Override
public void run() {
// Do all your view updates in here
textView.setText("string");
}
});
....
我看不到代码的上下文,但如果它是一个片段:
getActivity().runOnUiThread(…);
还有其他切换到主线程的方法。您可能还需要调查异步任务和处理程序。您可以进行堆栈后跟踪吗?@Firda Elletlar的回答对您有帮助还是您仍然面临问题?如果有,请接受答案。如果没有,请评论仍然不起作用的内容。