我正在使用ScheduledExecutorService定期运行Runnable。在Runnable中,我已经注册了一个SensorEventListener。我注意到,SensorEventListener回调在主线程上调用,而不是来自ScheduledExecutorService的线程池的线程。我想处理主线程传感器事件的回调。看起来我能够在调用SensorManager类的registerListener()时传递一个Handler对象,并且回调将在Handler来自的线程上运行。
有没有办法获得对ScheduledExecutorService的Handler的引用?
答案 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