Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新TextView时,带有scheduleAtFixedRate的计时器和TimerTask会导致CalledFromErrorThreadException崩溃_Java_Android_Timer - Fatal编程技术网

Java 更新TextView时,带有scheduleAtFixedRate的计时器和TimerTask会导致CalledFromErrorThreadException崩溃

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(

我是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(
                "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的回答对您有帮助还是您仍然面临问题?如果有,请接受答案。如果没有,请评论仍然不起作用的内容。