2013-02-12 64 views
1

对于Application对象,我打电话bindService()onServiceConnected()回调收到IBinder对象,并将其交给AsyncTaskAndroid:如何取消/中断同步服务呼叫?

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

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

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

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

我观察到AsyncTask一直在等待服务呼叫返回,这可以使标准Executor显着延迟下一个AsyncTask的开始。

任何经验?想法?

+0

你有没有检查你的AsyncTask里面是否使用AsyncTask.isCancelled()来取消它。如果你使用它,你可以简单地完成你的AsyncTask, – 2013-02-12 15:20:52

+0

@GauravArora感谢您的评论。正如我所说的,我想打断一个同步服务呼叫,我不能影响其中的代码。 – 2013-02-12 15:22:27

+0

通常,不能取消同步呼叫。这就是为什么他们是同步的。但是你可以尝试在你的超时处理程序启动后停止服务。 – 2013-02-12 15:32:06

回答

1

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

如果这是一个问题,你必须在服务API的设计任何输入,您可以使用一对单向的AIDL接口执行异步操作,像这样:

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

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