1

对于 Application 对象,我调用bindService(). onServiceConnected()回调接收一个IBinder对象,我把它交给一个AsyncTask.

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

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

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

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

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

有什么经验吗?想法?

4

1 回答 1

1

正如其他人所指出的,不能中断同步调用。

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

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

package sample;
oneway interface IClient {
    void reportResult(String result);
}
于 2014-12-23T04:36:24.727 回答