Получить значения датчика, пока основной поток приостановлен

Есть ли способ получить значения от датчика, когда основной поток приостановлен?

ЦЕЛЬ: Мне нужно зарегистрировать датчик освещенности, основной поток должен ждать 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 опубликовать исполняемый файл, который будет обрабатывать записанные данные.

Хотя лучше использовать запущенный сервис для ваших нужд.

Другие вопросы по тегам