Java 使用ExecutorService时获取对处理程序的引用

Java 使用ExecutorService时获取对处理程序的引用,java,android,multithreading,Java,Android,Multithreading,我使用ScheduledExecutorService定期运行可运行的。在Runnable中,我注册了一个SensorEventListener。我注意到在主线程上调用SensorEventListener回调,而不是从ScheduledExecutorService的线程池中调用线程。我想处理来自主线程的传感器事件的回调。在调用SensorManager类的registerListener()时,我似乎能够传递处理程序对象,回调将在处理程序所在的线程上运行 有没有办法获取对ScheduledE

我使用ScheduledExecutorService定期运行可运行的。在Runnable中,我注册了一个SensorEventListener。我注意到在主线程上调用SensorEventListener回调,而不是从ScheduledExecutorService的线程池中调用线程。我想处理来自主线程的传感器事件的回调。在调用SensorManager类的registerListener()时,我似乎能够传递处理程序对象,回调将在处理程序所在的线程上运行


有没有办法获取对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中。谢谢