Получить значения датчика, пока основной поток приостановлен
Есть ли способ получить значения от датчика, когда основной поток приостановлен?
ЦЕЛЬ: Мне нужно зарегистрировать датчик освещенности, основной поток должен ждать 10 секунд, а затем я должен получить среднее значение после этих 10 секунд.
ПРОБЛЕМА: я должен ждать в главном потоке, поэтому, если я делаю некоторое время или сплю, датчик не получает никакого значения
ЧТО Я ПОПРОБОВАЛ: Я попытался зарегистрировать датчик в другом потоке или асинхронной задаче, но ничего не произошло, если я приостановил основной поток на 10 секунд (я пытался выполнить сон, обработчик, какое-то время и соединение). Пользователь предложил мне использовать обработчик и onPause/onResume. Мой настоящий код такой, но я все еще ничего не получаю, пока основной поток ожидает:
public class MyActivity
{
private Lux light; //Lux implements SensorEventListener
private SensorManager mSensorManager;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.listeners);
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
light=new Lux();
onPause();
}
@Override
protected void onResume()
{
mSensorManager.unregisterListener(light, mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT));
light.getAverage();
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
mSensorManager.registerListener(light, mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_FASTEST);
Handler h=new Handler();
h.postDelayed(myTask, 10000);
}
private Runnable myTask = new Runnable()
{
public void run()
{
onResume();
}
};
}
Пожалуйста, помогите мне.
2 ответа
Я решил таким образом. это было проще, чем я думал.
SensorManager mSensorMgr = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
HandlerThread mHandlerThread = new HandlerThread("sensorThread");
mHandlerThread.start();
Handler handler = new Handler(mHandlerThread.getLooper());
mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST, handler);
onPause/onResume не предназначены для вызова пользователем. Они должны вызываться только вашей системой.
EventListener
Методы вызываются системой в главном потоке, поэтому, если вы остановите это каким-либо образом, они просто не будут вызваны.
в вашем onCreate
, не в onPause
опубликовать исполняемый файл, который будет обрабатывать записанные данные.
Хотя лучше использовать запущенный сервис для ваших нужд.