有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    这很难。常规的ExecutorService没有Looper,这样的线程中不能有Handler

    A Looper是一个无限循环,用于对事件进行排队和执行。所以如果你安排你的遗嘱执行人被阻止。您可能可以基于活套的事件处理实现自己的执行器,但我猜这不是您想要的

    要在后台使用传感器,您需要创建一个HandlerThread。这是一个运行循环器的后台线程,因此它可以有一个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();
    }
    
  3. # 3 楼答案

    Handler总是在它创建的线程中“处理”事情,所以只需在ExecutorService中创建一个新的。只需使用default Handler constructor