我有下面的代码来执行汽车的Android应用程序的模拟,但似乎线程没有很好地同步我如何解决这个问题
public void Simulation()
{
ambientTemp = 20;
engTemp = 20;
mileage = 123456;
fuel = 100;
thread = new Thread()
{
menu1_Fragment f1 = new menu1_Fragment();
menu2_Fragment f2 = new menu2_Fragment();
menu3_Fragment f3 = new menu3_Fragment();
public void run()
{
for (int i=0; i<l; i++)
{
try {
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
speed = SPEED[i];
revs = ENGSPEED[i];
System.out.println(speed);
System.out.println(revs);
fuel -= 1;
engTemp += 0.5;
mileage += 1;
gear = AMP[i];
time += 1;
if (tachoFrag != null && tachoFrag.isVisible())
{
View item1 = findViewById(R.id.progressBar4);
f1.setRevs(item1,revs);
f1.setSpeed(speed);
f1.setFuelGauge(fuel);
final View item2 = findViewById(R.id.milage);
final View item3 = findViewById(R.id.ambienttemp);
final View item4 = findViewById(R.id.gear);
try {
Thread.sleep(1);
runOnUiThread(new Runnable() {
@Override
public void run() {
f1.setMileage(item2,mileage);
f1.setAmbientTemp(item3,ambientTemp);
f1.setGear(item4,gear);
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, f1);
transaction.commit();
}
});
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
我添加了一些println,以确保循环正常工作,看起来很好但是UI并不令人耳目一新,因为它应该是......我该如何解决?
答案 0 :(得分:1)
您提供的代码非常糟糕,适用于Android。所有同步都通过Handlers
处理,结果将发布到一个或另一个线程。例如,如果你执行new Handler()
,那么你正在创建一个&#34;线程处理程序&#34;对于当前线程,默认情况下是主线程。
如果你打电话给handler.post(myRunnable)
,你将在UI线程中运行一些东西,但你可以用其他线程或循环线程做类似的事情。
鉴于此,如果您的问题是UI没有在您想要的时刻刷新,原因可能是您没有&#34;发布&#34;在正确的时刻将结果传递给UI线程。因此,在启动线程之前,创建一个UI处理程序,并从您的线程发布结果。请记住,不允许您在UI线程之外执行任何UI操作。
快速提示
根据我的经验,使用Thread.sleep(n)
对于线程之间的同步,使用红绿灯或它们之间的消息不是一个好主意。
答案 1 :(得分:0)
您是否在线程上调用了.start()
?另外你为什么尝试一个ms Thread.sleep
?
答案 2 :(得分:0)
据我了解,您无法从其他线程更新UI线程。为此,您必须向UI主线程发送消息 这可能有所帮助 Updating Android UI using threads