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