0

私が達成したいのは、メソッドで正しい結果セットを返すことisCloseです。問題は、isCloseメソッドがトリガーされるのを待機しておらず、フィールドonSensorChangedのデフォルトの「0」値を返すことです。isClose

私は自分の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. 
}


}
4

1 に答える 1

0

最初のイベントにはメインスレッドwaitを用意する必要があります。これはさまざまな方法で実現できますが、変数を使用するのがおそらく最も簡単です。isCloseonSensorChangedCondition

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たが、それはあなたにアイデアを与えるはずです。

于 2013-01-19T15:32:51.903 に答える