从OnSensorChanged()方法返回值

时间:2013-01-19 15:16:55

标签: android return proximity

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

我这样称呼我的位置课:
       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. 
}


}

1 个答案:

答案 0 :(得分:0)

您需要在wait中为第一个isClose事件设置主线程onSensorChanged,您可以通过多种方式实现此目标,但使用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个检查,但它应该会给你一个想法。