java-如何循环setText()-使应用程序崩溃

java-如何循环setText()-使应用程序崩溃,第1张

概述我是Android编程的新手.现在,我想更新活动中的值并按时间间隔更改它,并将其设置为活动中的TextView.所以,这里的代码:车类:publicclassCar{publicintSpeed;publicintRPM;publicintDistance;publicintFuel;publicCar(intSpeed,intRPM,intDistance,intFuel

我是Android编程的新手.现在,我想更新活动中的值并按时间间隔更改它,并将其设置为活动中的TextVIEw.所以,这里的代码:

车类:

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;@OverrIDeprotected 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);}

我认为的问题是因为我试图在new Timer()中设置文本,这导致应用程序关闭.谢谢.

解决方法:

是的,您的直觉是正确的.发生问题的原因是正在从计时器更新视图.

该错误将类似于以下内容:

androID.vIEw.VIEwRootImpl$CalledFromWrongThreadException: Only the
original thread that created a vIEw hIErarchy can touch its vIEws.

在AndroID中,只能通过“ UI线程”(通常称为“主线程”)更新视图.

这里的问题是Runnable的run()方法在单独的线程中执行.

可以在活动的主线程上进行更新,如下所示:

...runOnUiThread(new Runnable() {    @OverrIDe     public voID run() {        // Do all your vIEw updates in here        textVIEw.setText("string");    }});....

我看不到您的代码的上下文,但是如果它是一个片段:
getActivity().runOnUiThread(…);

还有其他切换到主线程的方法.您可能还想研究AsyncTask和Handlers.

总结

以上是内存溢出为你收集整理的java-如何循环setText()-使应用程序崩溃全部内容,希望文章能够帮你解决java-如何循环setText()-使应用程序崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1081489.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存