Java 使用ExecutorService时获取对处理程序的引用
我使用ScheduledExecutorService定期运行可运行的。在Runnable中,我注册了一个SensorEventListener。我注意到在主线程上调用SensorEventListener回调,而不是从ScheduledExecutorService的线程池中调用线程。我想处理来自主线程的传感器事件的回调。在调用SensorManager类的registerListener()时,我似乎能够传递处理程序对象,回调将在处理程序所在的线程上运行Java 使用ExecutorService时获取对处理程序的引用,java,android,multithreading,Java,Android,Multithreading,我使用ScheduledExecutorService定期运行可运行的。在Runnable中,我注册了一个SensorEventListener。我注意到在主线程上调用SensorEventListener回调,而不是从ScheduledExecutorService的线程池中调用线程。我想处理来自主线程的传感器事件的回调。在调用SensorManager类的registerListener()时,我似乎能够传递处理程序对象,回调将在处理程序所在的线程上运行 有没有办法获取对ScheduledE
有没有办法获取对ScheduledExecutorService处理程序的引用?您可以尝试
Handler Handler=new Handler(Looper.myLooper())在后台线程(您的ScheduledExecutorService
正在运行的位置)中执行code>,然后将实例传递给SensorManager
,您可以尝试Handler Handler=new Handler(Looper.myLooper())在后台线程中(运行ScheduledExecutorService
的位置),然后将实例传递给SensorManager
处理程序总是在创建它的线程中“处理”事情,所以只需在ExecutorService
中创建一个新的。只需使用处理程序就可以在创建它的线程中始终“处理”它,所以只需在执行器服务中创建一个新的处理程序。只需使用这很难。常规的执行器服务
没有活套
,在这样的线程中也不能有处理程序
Looper
是一个无限循环,用于对事件进行排队和执行。所以如果你安排你的遗嘱执行人被阻止。您可能可以基于活套的事件处理实现自己的执行器,但我想这不是您想要的
要在后台使用传感器,您需要创建一个HandlerThread
。这是一个运行循环器的后台线程,因此它可以有一个处理程序
小例子
private HandlerThread mHandlerThread;
private Handler mBackgroundHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandlerThread = new HandlerThread("SomeNameHere");
mHandlerThread.start();
mBackgroundHandler = new Handler(mHandlerThread.getLooper());
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
// I can do blocking network here.
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandlerThread.quitSafely();
}
这很难。常规的执行器服务
没有活套
,在这样的线程中也不能有处理程序
Looper
是一个无限循环,用于对事件进行排队和执行。所以如果你安排你的遗嘱执行人被阻止。您可能可以基于活套的事件处理实现自己的执行器,但我想这不是您想要的
要在后台使用传感器,您需要创建一个HandlerThread
。这是一个运行循环器的后台线程,因此它可以有一个处理程序
小例子
private HandlerThread mHandlerThread;
private Handler mBackgroundHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandlerThread = new HandlerThread("SomeNameHere");
mHandlerThread.start();
mBackgroundHandler = new Handler(mHandlerThread.getLooper());
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
// I can do blocking network here.
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandlerThread.quitSafely();
}
然后发生了,然后发生了,这就是我最后做的。每10秒我想为SensorEvenListener记录2秒的样本。最后,我制作了一个HandlerThread,得到了它的处理程序的引用,并在注册期间将其传递给SensorManager。然后,HandlerThread接收回调事件并将值添加到列表中。我保留了预定的ExecutorService,它每10秒运行一次runnable,用于注册传感器事件,休眠2秒(在此期间HandlerThread将值排队),然后唤醒注销传感器事件并将值缓存在db中。谢谢好吧,这就是我最后要做的。每10秒我想为SensorEvenListener记录2秒的样本。最后,我制作了一个HandlerThread,得到了它的处理程序的引用,并在注册期间将其传递给SensorManager。然后,HandlerThread接收回调事件并将值添加到列表中。我保留了预定的ExecutorService,它每10秒运行一次runnable,用于注册传感器事件,休眠2秒(在此期间HandlerThread将值排队),然后唤醒注销传感器事件并将值缓存在db中。谢谢