我的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
上进行了测试并且运行正常。
答案 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