Android bindServiceAsUser 等效 API,在执行器线程上运行

问题描述 投票:0回答:1

我当前的代码将执行程序线程传递给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 在内部将所有内容都放在主线程上。

java android multithreading
1个回答
0
投票

使用附加到后台线程(使用 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
    }
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.