我使用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();
}