
我是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()-使应用程序崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)