Android:如何取消/中断同步服务调用?

时间:2013-02-12 15:14:04

标签: android android-service request-cancelling

对于Application对象,我调用bindService()onServiceConnected()回调会收到一个IBinder对象,我将其移交给AsyncTask

在那里,我通过调用ServiceClass.Stub.asInterface(iBinderObject)获取服务对象,并使用此服务对象调用某个方法。

这是一个同步方法,我不能影响服务的超时设置(谁知道它的超时实现是否可靠)。所以,事先,我postDelayed()我自己的超时处理程序在一个单独的线程上。

超时代码调用unbindService()以解除服务中的应用程序绑定并产生超时结果。

如果超时首先运行,我还没有找到中断服务调用的方法。 unbindService()对此没有明显影响。调用AsyncTask.cancel(true)也没有任何改变。 IBinder对象似乎没有提供任何可以提供帮助的明显方法。

我观察到AsyncTask一直等待服务调用返回,这可能会使标准AsyncTask显着延迟下一个Executor的开始。

有经验吗?想法?

1 个答案:

答案 0 :(得分:1)

正如其他人所说,同步呼叫不能被中断。

如果这是一个问题,并且您在服务API的设计中有任何输入,您可以使用一对单向AIDL接口执行异步操作,如下所示:

package sample;
oneway interface IServer {
    void doWork(IClient cb);
}

package sample;
oneway interface IClient {
    void reportResult(String result);
}