2016-12-28 72 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

相关问题