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

neo*_*ion 2 java multithreading android

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

有没有办法获得对 ScheduledExecutorService 的处理程序的引用?

zap*_*apl 5

这个很难(硬。常规ExecutorService没有 a Looper,您不能Handler在这样的线程中有 a 。

ALooper是一个无限循环,它出列并执行事件。因此,如果您安排执行程序被阻止。您可能可以根据 Looper 的事件处理来实现自己的执行程序,但我想这不是您想要的。

要从背景中使用传感器,您需要创建一个HandlerThread. 这是一个运行 Looper 的后台线程,因此它可以有一个Handler.

小例子

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();
}
Run Code Online (Sandbox Code Playgroud)