2016-08-16 6 views
1

レルムを持つ項目のアンマネージ結果を照会して返す適切な方法は何ですか?バックグラウンドスレッドのすべて?私はこのようなsomethibfを使用しています:Android Kotlin Realmクエリの正しい方法+ Bgスレッドのアンマネージアイテムの返却

return Observable.just(1) 
       .subscribeOn(Schedulers.io()) 
       .map { 
        val realm = Realm.getDefaultInstance() 
        val results = realm.where(ItemRealm::class.java) 
          .equalTo("sent", false).findAll() 

        realm to results 
       } 
       .map { 
        val (realm, results) = it 
        val unManagedResults = realm.copyFromRealm(results) 
        realm.close() 
        unManagedResults 
       } 
    } 

し、サーバーに結果を掲載します別のもので、この観測可能に連鎖します。

溶液加工、この態様にビット醜いあるがこのことなく、バックグラウンドスレッドでrealInstanceを開くのない方法がありません ため

  • 観察可能でrealmQueryラッピングなし適切な方法、私はこの偽物を使用する必要があるので、私は知っているチートの種類(少なくとも私が知っている) observable Observable.just(1)を観察します。
  • ない開くのに最適な場所と近いレルムインスタンスは、第1および第2のマップ内の

  • すべてのアイテムがコピーされた後レルムインスタンスが閉じていることを保証されているかどうかは知りません。

だから、私はバックグラウンドで、サーバーに結果を送信するために、これを必要とし、このタスクから完全に独立しているとして、どのようなクエリの適切な方法で、バックグラウンドスレッド(一部のコンテキストに管理されていない結果を返す私のアプリケーションの現在のデータフローなので、メインスレッドから外す必要があります)。

バージョンを推奨:

return Observable.fromCallable { 
      Realm.getDefaultInstance().use { realm -> 
       realm.copyFromRealm(
         realm.where(ItemRealm::class.java) 
           .equalTo(ItemRealm.FIELD_SEND, false).findAll() 
       ) 
      } 
     } 

答えて

1

は、これは、あなたのレルムが管理されていないオブジェクトを有効にする方法を次のとおりです。

return Observable.defer(() -> { 
     try(Realm realm = Realm.getDefaultInstance()) { 
      return Observable.just(
       realm.copyFromRealm(
        realm.where(ItemRealm.class).equalTo("sent", false).findAll() 
       ) 
      ); 
     } 
    }).subscribeOn(Schedulers.io()); 

この答えは、Javaですが、Kotlinの答えはわずか半歩です。

+0

こんにちは、それはリソースを持つjava8 tryを使っています。明日のゴナは、それをリファクタリングして、defer + justの代わりにfromCallableを使用しようとします。 Gonaが動作するかどうかを確認します。そうでないと、なぜ同じではないのかを知っています。それに応じて私はあなたの答えを受け入れるでしょう。どうもありがとうございます! –

+0

あなたは自分の編集やコメントをチェックして、同じものであるのか、異なる結果を生み出すのかをコメントで伝えますか?私にとっては、同じです。私はあなたの答えを受け入れるよ –

+0

はい、それは同じであると思われ、それがうまくいく場合:) – EpicPandaForce

関連する問題