我当前的代码将执行程序线程传递给bindService API,如下所示:
public class SynchronousExecutor implements Executor {
@Override
public void execute(Runnable r) {
r.run();
}
}
context.bindService(
intent, Context.BIND_AUTO_CREATE, new SynchronousExecutor(), mConnection)
bindServiceAsUser 是否有一个等效的 API 可以像上面一样在执行器线程上运行?
context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)
我试图解决的问题基本上是 onServiceConnected 在使用 bindServiceAsUser 调用时导致主线程竞争条件与活页夹调用。text
我尝试将bindServiceAsUser调用本身放在ExecutorService Threadpool put上似乎没有解决问题。不知何故,bindServiceAsUser 在内部将所有内容都放在主线程上。
使用附加到后台线程(使用 ExecutorService 创建)的
Handler
来发布处理与绑定服务交互的任务。
private Handler backgroundHandler;
public void onCreate() {
super.onCreate();
backgroundHandler = new Handler(new HandlerThread("service-interaction").start().getLooper());
}
// Inside bind call (assuming backgroundHandler is initialized)
context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM);
// onServiceConnected implementation
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
// Defer service interaction to background thread
backgroundHandler.post(new Runnable() {
@Override
public void run() {
// Use the obtained binder to interact with the service
}
});
}