2013-01-19 114 views
0

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

我打电话给我的位置类这样的:
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. 
} 


} 

回答

0

你需要让你的主线程waitisClose第一个onSensorChanged事件,你可以通过很多方式实现这一点,但使用Condition变量将p可以说是最简单的。

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从上面的代码中检查,但它应该给你一个想法。