对于Application对象,我调用bindService()
。onServiceConnected()
回调接收一个IBinder
对象,我将其交给AsyncTask
。
在那里,我通过调用ServiceClass.Stub.asInterface(iBinderObject)
获得我的服务对象,并使用这个服务对象调用一些方法。
这是一个同步方法,我不会影响服务的超时设置(谁知道它的超时实现是否可靠)。因此,事先,我在一个单独的线程上postDelayed()
我自己的超时处理程序。
超时代码调用unbindService()
来解除应用程序与服务的绑定,并产生超时结果。
如果先超时,我还没有找到中断服务调用的方法。unbindService()
对此没有明显影响。调用AsyncTask.cancel(true)
也不会有任何改变。IBinder
对象似乎没有提供任何明显的有帮助的方法。
我观察到的是,AsyncTask
一直在等待服务调用的返回,这可能会大大延迟标准Executor
下一个AsyncTask
的启动。
有什么经验吗?想法?
正如其他人所指出的,同步调用不能中断。
如果这是一个问题,并且您在服务API的设计中有任何输入,那么您可以使用一对单向AIDL接口执行异步操作,如下所示:
package sample;
oneway interface IServer {
void doWork(IClient cb);
}
和
package sample;
oneway interface IClient {
void reportResult(String result);
}