使用ExecutorService时获取对Handler的引用

时间:2015-09-21 19:46:11

标签: java android multithreading

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

有没有办法获得对ScheduledExecutorService的Handler的引用?

3 个答案:

答案 0 :(得分:4)

很难。常规ExecutorService没有Looper,您不能在此类帖子中拥有Handler

Looper是一个无限循环,它会使事件出列并执行。因此,如果您安排执行者被阻止。您可以根据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();
}

答案 1 :(得分:0)

您可以在后台线程中尝试Handler handler = new Handler(Looper.myLooper());ScheduledExecutorService正在运行的位置),然后将实例传递给SensorManager

答案 2 :(得分:0)

处理程序始终在处理它创建的线程中“处理”事物,因此只需在char enterChar(); 中创建一个新事物。只需使用default Handler constructor

即可