从OnSensorChanged()方法返回值



我想要实现的是在方法isClose中返回正确的结果集。问题是isClose方法没有等待onSensorChanged被触发,并返回isClose字段的默认值"0"。

我这样调用Position类:
Position mPosition = new Position();

boolean result = mPosition.isInPocket(this);

位置类:

public class Position implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mProximity;
  private boolean isClose;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
    float[] value = event.values;

    if(value[0] > 0)    {
        isClose = false;
    }   else
                {
          isClose = true;
    }   
}
public boolean isClose(Context context) {
    mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    mSensorManager.registerListener(this, mProximity, 0);

    return isClose; // I'd like to return this with value set in onSensorChanged. 
}

}

对于第一个onSensorChanged事件,您需要在isClose中拥有您的主线程wait,您可以通过多种方式实现这一点,但使用Condition变量可能是最简单的。

public class Position implements SensorEventListener {
    private SensorManager mSensorManager;
    private Sensor mProximity;
    private boolean isClose;
    private final Lock lock = new ReentrantLock();
    private final Condition eventReceived = lock.newCondition();
    private boolean firstEventOccurred = false;
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    public void onSensorChanged(SensorEvent event) {
        float[] value = event.values;

        if (value[0] > 0)    {
            isClose = false;
        }   else {
            isClose = true;
        }
        if (!firstEventOccurred) {
            lock.lock();
            try {
                firstEventOccurred = true;
                eventReceived.signal();
            } finally {
                lock.unlock();
            }
        }
    }
    public boolean isClose(Context context) {
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        mSensorManager.registerListener(this, mProximity, 0);
        lock.lock();
        try {
            while (!firstEventOccurred) {
                eventReceived.await();
            }
        } finally {
            lock.unlock();
        }
        return isClose; // I'd like to return this with value set in onSensorChanged. 
    }

我从上面的代码中省略了InterrupedException检查,但它应该给你一个想法。

相关内容

  • 没有找到相关文章

最新更新