0

我有一项服务正在下载一些数据,并且我想将进度值发送到绑定到该服务的活动。

我知道类似问题的可用解决方案:AsyncTask、Messenger 和 Bounding Activity to a service。我想使用有界服务方法来实现它。

我发现的所有示例都在服务中创建了公共方法,并在将其绑定到服务后从活动类中调用该方法,但我认为在我的情况下,这将需要无限循环来获取频繁的更新值。是否有任何方法可以使服务将数据发送到活动以及在进度值更改时如何更新 UI?(不使用 Messenger 或 AsycTask)

提前致谢。

4

1 回答 1

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
            }
        });
    }
};

您的客户端将此回调传递给服务,服务调用它,您在客户端的方法被调用。

于 2013-10-01T11:59:44.710 回答