修复android中的线程同步

时间:2015-04-23 22:35:16

标签: android multithreading

我有下面的代码来执行汽车的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并不令人耳目一新,因为它应该是......我该如何解决?

3 个答案:

答案 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