2016-12-28 75 views
0

我正在研究使用傳感器的應用程序。 我將有機會按照給定的順序在控制檯中顯示傳感器數據。首先,我得到並查看來自加速度計的數據,下一個磁力計數據。 目前,數據隨機顯示。一旦加速計,一旦磁力計。有時他們出現兩次。如何順序獲取傳感器數據?

這裏是我的代碼:

public class StartFragment extends Fragment implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor accelerometer; 
private Sensor magnetic; 
private static final int PERIOD = 10000; 
private Handler handler; 
boolean flag = false; 

private final Runnable processSensors = new Runnable() { 
    @Override 
    public void run() { 
     sensorManager.registerListener(StartFragment.this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
     sensorManager.registerListener(StartFragment.this, magnetic, SensorManager.SENSOR_DELAY_UI); 
     flag = true; 

     handler.postDelayed(this, PERIOD); 
    } 
}; 

public StartFragment(){} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_start, container, false); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); 
    sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE); 
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    handler.post(processSensors); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    handler.removeCallbacks(processSensors); 
    sensorManager.unregisterListener(this, accelerometer); 
    sensorManager.unregisterListener(this, magnetic); 
} 

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 
    float[] value = sensorEvent.values; 
    if (flag) { 

     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " x: " + Float.toString(value[0])); 
     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " y: " + Float.toString(value[1])); 
     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " z: " + Float.toString(value[2])); 

     flag = false; 
    } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int i) {} 

回答

2

我相信,有什麼不對你的方法。傳感器異步工作,他們在可以回答時回答。軟件的作用是在問題出現時獲得答案並使用它們。

您的案例中的解決方案imho可以在您獲得上一個傳感器的值之後啓動並初始化任何傳感器,或者更好地,只是異步工作並保持您的可視化獨立(也就是說, mvp編程的基礎知識)

+0

如何使我的方法異步?一些有價值的技巧 – phoenix37

+0

我想你可以在onSensorChanged方法中添加一些if(),它調用不同的方法來顯示不同的傳感器數據,具體取決於接收的傳感器數據。你*是否必須*必須按照該順序顯示信息? –

+0

是的,因爲接下來我會將數據存儲在數據庫中。我希望獲得更多的結構:來自加速度計的一行數據,來自磁力計的第二行數據等。 – phoenix37

相關問題