2017-01-31 5 views
1

Observable getWhere(@NonNull RealmQuery realmQuery)メソッドを持つバックグラウンドスレッドで動作するDBServiceクラスを実装しようとしています。私は同じスレッド上でRealmインスタンスを作成する必要があることを知っているので、私はそれにアクセスします。だから、私はバックグラウンドスレッドでRealmQueryを作成する方法を見つけましたが、その恐ろしいハックです。すべての私の他の試みはjava.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were createdバックグラウンドスレッドでRealmQueryを作成

プレゼンターコードの結果:。)

dataUseCase.searchDisk(getRealmQuery(RepoRealm.class) 
       .equalTo("owner.login", userLogin), RepoRealm.class) 


public static getRealmQuery RealmQuery(Class clazz) { // horrible hack 
    if (handler == null) 
     handler = new Handler(getHandlerThread().getLooper()); 
    handler.postAtFrontOfQueue(() -> realmQuery = RealmQuery.createQuery(Realm.getDefaultInstance(), clazz)); 
    while (true) if (realmQuery != null) break; 
    return realmQuery; 
} 

getHandlerThread(getLooperは()私の唯一のバックグラウンドスレッドを返します。

DBService:

public Observable<List> getWhere(@NonNull RealmQuery realmQuery) { 
    return Observable.defer(() -> { 
     Realm realm = Realm.getDefaultInstance(); 
     return realmQuery.findAll().asObservable() 
       .filter(results -> ((RealmResults) results).isLoaded()) 
       .map(o -> realm.copyFromRealm((RealmResults) o)) 
       .doOnUnsubscribe(() -> closeRealm(realm)); 
    }); 
} 

私は他のアプローチを試みたが、私はいつも間違ったスレッドからレルムへのアクセスの例外を受け取ります。

私の解決策は動作しますが、realmQueryが作成されるまでしばらくの間、私のアプリをフリーズすることができますが、これは避けたいものです。助言がありますか?前もって感謝します。

+0

うん、 'handler.postAtFrontOfQueue)を使用し'とスレッド間でランダムレルム管理対象オブジェクトを投げる、あなたはすでにかなり 'observeOn(AndroidSchedulers.mainThreadを())'持っRxJavaを使用している場合は特にありませんまったく同じことが多いです – EpicPandaForce

+0
+0

この質問に答えるには、Realm **から入手した 'RealmResults 'で正確に何をするのかを知る必要があります。 – EpicPandaForce

答えて

1
public <T extends RealmModel> Observable<List<T>> getWhere(RealmQueryProvider<T> queryFactory) { 
    return Observable.defer(() -> { 
     Realm realm = Realm.getDefaultInstance(); 
     return queryFactory.create(realm).asObservable() 
       .filter(results -> ((RealmResults<T>) results).isLoaded()) 
       .map(o -> realm.copyFromRealm((RealmResults<T>) o)) 
       .doOnUnsubscribe(() -> closeRealm(realm)); 
    }); 
} 

public interface RealmQueryProvider<T extends RealmModel> { 
    RealmResults<T> create(Realm realm); 
} 

// example 
Observable<List<Dog>> dogs = dbService.getWhere((realm) -> realm.where(Dog.class).findAll()); 
+0

このコードはコンパイルされません。 queryFactory.create(realm).asObservable() create(realm)にはメソッドとしてasObservableがありません –

+0

私の例で示されたような結果になっているはずです – EpicPandaForce

+0

それを分かりました。私はそれを試していた、それは動作します。しかし、私はパフォーマンスの問題に直面している。その私の私のUIThreadを凍結しているが、私はまだ何か他のものがあるかどうかを確認している。 –

関連する問題