Realm RealmObjectChangeListener, зарегистрированный в потоке пользовательского интерфейса, не вызывается после фонового обновления
Почему мой RealmObjectChangeListener, зарегистрированный для объекта в потоке пользовательского интерфейса, не вызывается, когда объект обновляется в фоновом потоке?
Я получаю свой объект Realm, а также делаю копию не Realm через класс, созданный как для действия, так и для отдельного экземпляра фоновым процессом. Этот класс также содержит метод обновления области, используемый как действием, так и фоновым процессом:
public class AudioRecordUtils {
....
public AudioRecord getRealmAudioRecord(long id) {
return realm.where(AudioRecord.class).equalTo(AudioRecord.FIELDS.id.name(), id).findFirst();
}
public AudioRecord getNonRealmAudioRecord(long id) {
AudioRecord realmAudioRecord = getRealmAudioRecord(id);
return copyToNonRealmAudioRecord(realmAudioRecord);
}
public AudioRecord copyToNonRealmAudioRecord(AudioRecord realmAudioRecord) {
AudioRecord nonRealmAudioRecord = null;
if (realmAudioRecord != null) {
nonRealmAudioRecord = realm.copyFromRealm(realmAudioRecord);
}
return nonRealmAudioRecord;
}
public void updateAudioRecordAsync(final AudioRecord audioRecord) {
// Asynchronously update objects on a background thread
realm.executeTransactionAsync(
new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
bgRealm.copyToRealmOrUpdate(audioRecord);
}
}
, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
realm.refresh();
Log.e(TAG, "Success: audioRecord updated: JobId:" + audioRecord.getXlatJobNumber()
+ " text:" + audioRecord.getSpeechToTextTranslation());
}
}
, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
Log.e(TAG, "Error:" + error.toString());
}
});
}
В упражнении я определяю RealmObjectChangeListener:
private final RealmObjectChangeListener<AudioRecord> audioRecordChangeListener = new RealmObjectChangeListener<AudioRecord>() {
@Override
public void onChange(AudioRecord audioRecord, ObjectChangeSet changeSet) {
if (audioRecord != null) {
updateDisplay(audioRecord);
}
for (String fieldName : changeSet.getChangedFields()) {
Log.i(TAG, "Field " + fieldName + " was changed.");
}
}
};
Также в упражнении я получаю объект Realm, создаю копию nonRealm и регистрируем слушателя на объекте области:
AudioRecord realmAudioRecord = audioRecordUtils.getRealmAudioRecord(audioRecordId);
if (realmAudioRecord != null) {
realmAudioRecord.addChangeListener(audioRecordChangeListener);
audioRecord = audioRecordUtils.copyToNonRealmAudioRecord(realmAudioRecord);
....
Если я обновлю копию nonRealm и вызову следующую подпрограмму, слушатель сработает:
Но я также могу запустить фоновый процесс (используя RxJava). Когда объект обновляется, слушатель не запускается.
Observable<SpeechToTextConversionData> updateRealmObservable(SpeechToTextConversionData speechToTextConversionData, Context context) {
Observable<SpeechToTextConversionData> observable = Observable.create(new ObservableOnSubscribe<SpeechToTextConversionData>() {
@Override
public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<SpeechToTextConversionData> emitter) throws Exception {
if (!speechToTextConversionData.getAudioText().isEmpty()) {
AudioRecord audioRecord = audioRecordUtils.getNonRealmAudioRecord(speechToTextConversionData.getAudioRecordRealmId());
if (audioRecord != null) {
audioRecord.setSpeechToTextTranslation(speechToTextConversionData.getAudioText());
audioRecord.setXlatJobNumber(0);
audioRecordUtils.updateAudioRecordAsync(audioRecord); // Why isn't listener triggered?
}
}
emitter.onNext(speechToTextConversionData);
emitter.onComplete();
}
});
return observable;
}