Przeczytałem wiele postów dotyczących tego tematu, ale wciąż jest to dla mnie trochę niejasne. Rozumiem, że nie można uzyskać dostępu do obiektów klasy lub obszaru rzeczywistego w różnych wątkach, więc zastanawiam się, jaki jest optymalny sposób na obsłużenie tego.Dostęp do obszaru przez wątki z rxjava i dagger2
Mam usługę, która uruchamia wątek. Wątek ten działa w tle (w tym działa przez rxjava
na Schedulers.io
). Teraz w pewnym momencie chcę zapisać niektóre dane do sfery, która żyje w klasie DataManager. Pierwotnie używałem Dagger2
do wstrzyknięcia Realm
do mojej klasy DataManager (która sama została wstrzyknięta do usługi). Jednak to nie zadziała, ponieważ wtrysk został wykonany na głównym wątku, więc Realm.getDefaultInstance()
jest związany z głównym wątkiem, ale jest dostępny w DataManager z innego wątku.
Jedyną opcją feasiblbe, o której mogę pomyśleć, to wywołanie Realm.getDefaultInstance()
i realm.close()
na początku i na końcu każdej metody przeprowadzania transakcji. Nie mam nic przeciwko temu, ale zastanawiam się, czy wystąpi wydajność, dzwoniąc pod numer Realm.getDefaultInstance()
za każdym razem, gdy chcę zapisać obiekt. Czy jest lepszy sposób to zrobić? Z góry dziękuję.
'Realm.getDefaultInstance()' będzie nieco powolne, jeśli jest to pierwsze wystąpienie wśród wszystkich wątków. W przeciwnym razie zwraca się natychmiast, ponieważ Realm buforuje schematy wewnętrznie. Zobacz https://github.com/realm/realm-java/issues/2231 – beeender
FYI Zdecydowałem się porzucić Realm dla mojego konkretnego przypadku użycia. Zasadniczo potrzebowałem zrobić 'copyFromRealm' na wszystkich moich przyniesionych obiektach, tak że mogłem przekazać je przez wątki, a wtedy korzyści z obiektu na żywo były prawie na wyciągnięcie ręki. Było to również farbą do zarządzania zamykaniem instancji w klasach pomocników. Jestem pewien, że jest lepszy sposób, aby sobie z tym poradzić, ale zdecydowałem się trzymać z sqlite i orm. – pat