gpt4 book ai didi

android - SensorEventListener 在单独的线程中

转载 作者:IT老高 更新时间:2023-10-28 23:39:56 29 4
gpt4 key购买 nike

这似乎是一个基本问题,但在搜索了一段时间并使用它之后,我已经到了需要帮助的地步。我想让 SensorEventListener 在与 UI 不同的线程中运行,这样当事件进入时需要进行的计算不会减慢 UI 的速度。

我最近的尝试是这样的:

class SensorThread extends Thread {
SensorManager mSensorManager;
Sensor mSensor;

public void run() {
Log.d( "RunTag", Thread.currentThread().getName() ); // To display thread
mSensorManager = (SensorManager)getSystemService( SENSOR_SERVICE );
mSensor = mSensorManager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER );
MySensorListener msl = new MySensorListener();
mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI );
}

private class MySensorListener implements SensorEventListener {
public void onAccuracyChanged (Sensor sensor, int accuracy) {}
public void onSensorChanged(SensorEvent sensorEvent) {
Log.d( "ListenerTag", Thread.currentThread().getName() ); // To display thread
}
}

在 Activity (或服务)的 onCreate() 中,我创建了一个 SensorThread 对象并调用它的 start() 方法。如您所料,调试日志显示新线程中的“RunTag”条目。但是 onSensorChanged() 的“ListenerTag”在主线程中运行,即使它的对象是在新线程中实例化的。我该如何改变呢?

最佳答案

有点晚了,但如果其他人还想知道,这里是实现这一目标的好方法。与多线程一样,请确保您知道自己在做什么并花时间正确处理,以避免那些奇怪的错误。玩得开心!

类(class)成员:

private HandlerThread mSensorThread;
private Handler mSensorHandler;

在 OnCreate 或注册时:

mSensorThread = new HandlerThread("Sensor thread", Thread.MAX_PRIORITY);
mSensorThread.start();
mSensorHandler = new Handler(mSensorThread.getLooper()) //Blocks until looper is prepared, which is fairly quick
yourSensorManager.registerListener(yourListener, yourSensor, interval, mSensorHandler);

注销时,也要这样做:

mSensorThread.quitSafely();

关于android - SensorEventListener 在单独的线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3286815/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com