2014-10-28 13 views
7

W moich aplikacjach zwykle mam program ładujący, który ładuje dane z sqlite, a następnie przekazuje je do działania lub fragmentu, do którego jest dołączony, skąd jest ustawiany w adapterze z absListView, który następnie przedstawia ją użytkownikowi, ponieważ rzeczywistość stwierdza, że ​​jego objects shouldn't be shared across threads, w jaki sposób można to osiągnąć bez wykonywania żadnych wywołań db z wątku UI? (Co może sprawić, że aplikacja czuć się ospały jak uderzę db dobrą ilość)Jak osiągnąć następujące rzeczy w Dziedzinie dla Androida

Również w 3 examples - intro, gridView & migration, kilka razy db operacje wykonywane są w wątku UI. Czy operacje na bazach danych w wątku interfejsu użytkownika nie są mocno skrzywione w systemie Android?

cytat z docs - Potentially long running operations such as network or database operations, or computationally expensive calculations such as resizing bitmaps should be done in a worker thread (or in the case of databases operations, via an asynchronous request).

Odpowiedz

4

Masz rację, obecnie nie jest możliwe, aby załadować przedmioty na wątek tła, a następnie analizować je do wątku UI. To jest na mapie drogowej jednak, zobacz tutaj: https://github.com/realm/realm-java/issues/503

Realm jest dość szybki, więc do tej pory, dla mniejszych ilości danych prawdopodobnie nie pomijałbyś ramek, nawet jeśli wczytujesz dane w wątku UI.

+0

Niestety mam do czynienia z dużą ilością danych !! Zamierzam poczekać, aż ta funkcja zostanie wywalczona przed wdrożeniem Królestwa –

+0

Ile w Twoim przypadku jest "dużo"? – bmunk

+0

@ChristianMelChior: Cześć. Czy Realm obsługuje niestandardowe zamówienia sortowania? Na przykład mam tabelę, która ma 3 pola: nazwę miejsca geograficznego, jego szerokość i długość geograficzną. Chcę posortować wynik w zależności od odległości od bieżącej lokalizacji (która będzie się różnić w zależności od lokalizacji użytkownika). Dzięki – Rajat

2

Kiedy po raz pierwszy przeczytałem o rzeczywistości na ich stronie, byłem bardzo podekscytowany sprawdzeniem ich testu porównawczego. Kiedy jednak wszedłem do części ograniczającej, utknąłem tam przez 2 minuty i zastanawiałem się nad "zapobieganiem dzieleniu się przedmiotami przez wątki". Od wewnątrz mówiło mi, że idę do królestwa, ale to ograniczenie powstrzymuje mnie. W końcu zdecydowałem się zaimplementować jakieś opakowanie, które pozwala mi udostępniać ten obiekt we wszystkich wątkach.

O to chodzi. Proces odczytywania i zapisywania na dysku zajmuje więcej czasu niż proste tworzenie obiektu. To jest punkt, który noszę przy tworzeniu opakowania.

1) I keep pozwala na stworzenie obiektu podklasy realmObject w dowolnym miejscu w stosunku do reguły dostępu do obiektu w tym samym wątku, na którym jest tworzony.

np.

XyzsubclassofRealmObject xyzObject = new XyzsubclassofRealmObject(); 

2) Przepuścić tego obiektu do metody, która wykonuje operację bazy danych

np

insertOrUpdate(xyzObject); 

//implementation 
insertOrUpdate(XyzsubclassofRealmObject object) //you can make this method generic to accept any object that is subclass of RealmObject 
{ 
    Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 
    XyzsubclassofRealmObject databaseObject = realm.copyToRealmOrUpdate(object); 
    //notice this copyToRealmOrUpdate method provides by Realm 
    realm.commitTransaction(); 
    XyzsubclassofRealmObject copyObject = clone(databaseObject);   
    return copyObject; 
} 

3) Teraz są również dwa punkt one wspomnieć, że

  • podklasa RealmObject tylko domyślny getter i metody setter i pozwala metody statycznej, jeśli chce nasz inną logikę. dzięki Bogu, pozwalają na statyczną metodę. :)

  • może implementować interfejs bez metod. :(

Myślałam o klonowanie databaseObject który wrócił z copyToRealmOrUpdate. Jako interfejs pozwala bez metody (tj 2nd punkt), 1 punkt przyszedł mi na pomoc.

public static XyzsubclassofRealmObject clone(XyzsubclassRealmObject databaseObject) 
{ 
     XyzsubclassOfRealmObject obj = new XyzsubclassofRealmObject(); 
     obj.setXyz(databaseObject.getXyz()); 
     return obj; 
} 

Zamiast wywoływać metodę klonowania bezpośrednio, jak pokazano tutaj, użyłem metody odbicia wywołać metodę klonowania jak pisałem rodzajowe otoki do wykonywania operacji bazy danych zamiast do konkretnego modelu. Możesz wybrać swój własny sposób:

To wszystko. Jesteś skończony. Jak widzisz, zwracamy skopiowany obiekt zamiast obiektu bazy danych, możesz go użyć w dowolnym wątku. :)

Wniosek: wiele blogów i postów mówi, że jest tak szybka w działaniu, że można jej używać w wątku interfejsu podczas wykonywania transakcji. Ale wybór zależy od ciebie. Nie wiesz z góry, ile danych będzie wprowadzanych do bazy danych od momentu, gdy zwiększy się wykorzystanie aplikacji. Jeśli ta transakcja będzie miała wystarczającą ilość danych, aby twój interfejs był powolny, będzie. Również wszyscy programiści mają praktykę wykonywania operacji na bazie danych i sieci w wątku roboczym zamiast w wątku UI, więc nie zatrzyma to żadnej interakcji UI.

Proces odczytu i zapisu na dysku zajmuje więcej czasu niż proste tworzenie obiektu

Powiązane problemy