0

私は現在RealmObjectsを照会してGoogleMapに表示するためにレルムを使用しています。 RealmResultsを読み込んで取得していますが、UIスレッドからマップにマーカーを配置する方法が見つかりません。 UIスレッドで約150msの遅延が発生するため、非同期呼び出しでこれを行うことをお勧めします。Realm Android:非同期トランザクションがUIスレッドに影響を与えます

public void loadLocations(final GoogleMap googleMap) { 
     try { 

     realm.executeTransactionAsync(new Realm.Transaction() { 

      @Override 
      public void execute(Realm realm) { 
       RealmResults<LocationObject> locations = realm.where(LocationObject.class).findAll(); 
       for (LocationObject location: locations) { 
         googleMap.addMarker(new MarkerOptions() 
           .position(new LatLng(location.lat, location.long)) 
       } 
      } 
     }); 
} 

どのようにして後でUIスレッドでRealmResultsにアクセスできますか? RealmObjectsがスレッド制限されているとRealmが言います

答えて

3

RealmChangeListenerを試すことができます。 Realm docsは、これを非常にはっきりと子犬の例を使って示しています。

RealmResults<LocationObject> locations; 

//... 
    locations = realm.where(LocationObject.class).findAllAsync(); 

    locations.addChangeListener(new RealmChangeListener<Person>() { 
     @Override 
     public void onChange(RealmResults<LocationObject> locations) { 
      googleMap.clear(); 
      for (LocationObject location: locations) { 
       googleMap.addMarker(new MarkerOptions() 
          .position(new LatLng(location.lat, location.long)); 
      } 
     } 
    } 

コード上は基本的にクエリが行われ、将来のクエリで呼び出されるときにコールバックメソッドが呼び出されるレルムデータベースとaddChangeListenerレジスタに非同期的にクエリを行う(ためrealm docsを参照してもコールこれについての詳細はこちら)。

だから、私はonStartまたはonResume方法では、上記のコードを実行することをお勧めし、そうのように、onStopまたは方法に変更リスナーを削除することを忘れないでください:

locations.removeChangeListeners(); 

最後に、しないでくださいレルムを閉じることを忘れないでください。それが役に立てば幸い!何かが不明な場合は、お気軽にお尋ねください。

+1

Ohhhhhので、最初の "findAllAsync"トランザクションが完了すると、その後のすべての更新に対して変更リスナーが呼び出されます。素晴らしいアドバイス、ありがとう@andyaldoo –

+0

@JesusGarciaまさに。 –

関連する問題