在线程上执行方法 - 在完成之前未执行/结束

时间:2015-05-28 08:02:15

标签: java android multithreading

我的Android应用Main Activity正在使用Thread因为正在使用一个非常“重”的算法而没有线程化它只是堆叠我的UI和应用程序。 那是我的Thread

@Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            mGravity = event.values;
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            mGeomagnetic = event.values;
        if (mGravity != null && mGeomagnetic != null) {
            float R[] = new float[9];
            float I[] = new float[9];
            boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                    mGeomagnetic);
            if (success) {

                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                azimuth_angle = (float) (orientation[0]*180/Math.PI); 
                pitch_angle = (float) (orientation[1]*180/Math.PI);
                roll_angle = (float) (orientation[2]*180/Math.PI);
        p.setText(String.valueOf(pitch_angle));
                 r.setText(String.valueOf(roll_angle));
                 y.setText(String.valueOf(azimuth_angle));


                 new Thread(new Runnable() {

                     public void run()
                       {


                          try 
                           {

                            Locations = Algo( pitch_angle, roll_angle,
                                        azimuth_angle);
                            Thread.sleep(500);
                           } 
                           catch (Exception e) 
                           {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                         }

                        }).start();
        }

问题: Algo时间约为150-300毫秒。我想这个线程在Algo完成之前再次激活。因为每次Thread运行时都会执行onSensorChanged。 我该怎么做才能让Algo按照预期将其值返回“地点”?

P.S Algo在Service上进行了测试并且运行正常。

2 个答案:

答案 0 :(得分:1)

首先,您的位置应该用小写字母书写,因为它是一个varibale。其次,如果多个线程使用某个变量,则必须将其声明为volatile。

你可以添加一个volatile布尔值来存储你的线程状态,例如true正在运行,flase则没有。您需要在运行线程之前将此变量设置为true,并将其设置为false以进入线程中的finally语句。当此变量的值为true(表示前一个线程正在运行)时,您只需从此方法返回,忽略该事件。

private volatile boolean heavyAlgRunning = false;

@Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            mGravity = event.values;
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            mGeomagnetic = event.values;
        if (mGravity != null && mGeomagnetic != null) {

            float R[] = new float[9];
            float I[] = new float[9];
            boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                    mGeomagnetic);
            if (success) {

                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                azimuth_angle = (float) (orientation[0]*180/Math.PI); 
                pitch_angle = (float) (orientation[1]*180/Math.PI);
                roll_angle = (float) (orientation[2]*180/Math.PI);
        p.setText(String.valueOf(pitch_angle));
                 r.setText(String.valueOf(roll_angle));
                 y.setText(String.valueOf(azimuth_angle));
                 if (heavyAlgRunning) return;
                 heavyAlgRunning = true;

                 new Thread(new Runnable() {

                     public void run()
                       {


                          try 
                           {

                            Locations = Algo( pitch_angle, roll_angle,
                                        azimuth_angle);
                            Thread.sleep(500);
                           } 
                           catch (Throwable e) 
                           {
                                // TODO Auto-generated catch block
                                Log.e("t","t",e);
                                //e.printStackTrace();
                            }
         //                    finally {
         //                        heavyAlgRunning =false;
          //                  }

                              heavyAlgRunning =false;

                         }

                        }).start();
        }

答案 1 :(得分:1)

您需要锁定线程,直到完成方程式。因此,您可以尝试在synchronized语句中添加try部分或使用其中一个线程系统锁:https://stackoverflow.com/a/24582076/3345366