领域在insertOrUpdate之后不发送数据

时间:2017-04-25 12:56:29

标签: android realm rx-java

我使用Firebase进行通知。 您可能知道,每个应用程序实例(粗略地)都会生成来自firebase的每个推送令牌。

首先,我将此令牌存储在Realm数据库中。登录成功后我称之为:

 private void updatePushToken(final RealmUser user) {
        String pushToken = FirebaseInstanceId.getInstance().getToken();
        final RealmPushToken token = getPushToken();

        token.setUserId(user.getId());
        token.setToken(pushToken);

        replacePushToken(token, null);
    }

   public void replacePushToken(@Nullable final RealmPushToken token, @Nullable OnInsertListener listener) {
    Realm instance = getRealmInstance();
    instance.executeTransactionAsync(realm -> {
                realm.delete(RealmPushToken.class);
                if (token != null) {
                    realm.insertOrUpdate(token);
                }
            }, /*listeners*/);
    }


    public RealmPushToken getPushToken() {
        try (Realm instance = getRealmInstance()) {
            RealmResults<RealmPushToken> tokens = instance.where(RealmPushToken.class).findAll();
            if (!tokens.isEmpty()) {
                return instance.copyFromRealm(tokens.first());
            }
            return new RealmPushToken();
        }
    }

同时我启动服务(理论上)应该监控基于RealmPushToken类的更改:

/* Launched in onCreate */
private void subscribeToPushToken() {
    Subscription subscription = getPushTokenAsync()
            .subscribeOn(immediateThread)
            .observeOn(uiThread)
            .subscribe(token -> {
                //Send token to backend
                    }, throwable -> {
                    //Log
                    }
            );

    compositeSubscription.add(subscription);
}


public Observable<RealmPushToken> getPushTokenAsync() {
    Realm instance = getRealmInstance();

    return instance.where(RealmPushToken.class)
            .findAllAsync()
            .asObservable()
            .filter(o -> o.isLoaded() && o.isValid())
            .map(tokens -> tokens.isEmpty() ? new RealmPushToken() : tokens.first())
            .doOnUnsubscribe(instance::close);
}

而且 - 当我正在看这个设计时,对我来说每次在第一次剪切时启动replacePushToken都会被触发(假设它成功了,通常是这样)。 发生的事情是Observable不会发出任何物品:/ 这意味着该服务未被通知有关更改,因此我没有向后端发送新令牌,这意味着我没有收到任何通知。

我有两个怀疑

一个。 Realm并不认为这是一个足以让人关心的变化。

湾旧的领域版本,线程等都会发生一些事情。

我错过了什么吗?

编辑:

import static io.realm.Realm.getDefaultInstance;

private Realm getRealmInstance() {
    return getDefaultInstance();
}

0 个答案:

没有答案