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

0 ответов

Другие вопросы по тегам