我有一个服务下载一些数据,我想将进度值发送到与此服务绑定的活动。
我知道类似问题的可用解决方案:AsyncTask,Messenger和服务的边界活动。我想用有界服务方法实现它。
我发现的所有示例都在服务中创建公共方法,并在将其绑定到服务之后从活动类调用该方法,但我认为在我的情况下,这将需要无限循环来获取频繁的更新值。是否有任何方法可以使服务将数据发送到活动,还有一些方法可以在进度值发生变化时更新UI? (不使用Messenger或AsycTask)
提前致谢。
答案 0 :(得分:0)
您可以在另一个AIDL中定义回调。
package ...;
interface XService {
...
void startX(String path, XServiceCallback callback);
}
并在另一个aidl文件中:
package ...;
interface XServiceCallback {
void xReady(int errCode, String text);
}
但是回调将以异步方式调用,因此您必须使用Handler.post(Runnable)。
另一种方法是使用Runnable在UI线程上重新发布自己(通过 postDelayed())并轮询进度,比如每0.2秒。
在这两种情况下,您都必须记住服务或客户端可能会死亡。
关于代码,你需要一些远程服务示例(在'net中有很多),并在客户端添加如下内容:
XServiceCallback mServiceCallback = new XServiceCallback.Stub() {
@Override
public void xReady(final int errCode, final String text) throws RemoteException {
handler.post(new Runnable() {
@Override
public void run() {
// use the result
}
});
}
};
您的客户端将此回调传递给服务,服务调用它,您的客户端方法被调用。