RETROFIT POST Realm обект

Имам следния API за RETROFIT:

@POST("/payments")    
Observable<Response> saveCreditCard(@Body CreditCard creditCard)

CreditCard is a RealmObject.

Когато се опитам да използвам своя API метод:

CreditCard card = realm.createObject(CreditCard.class);
card.setWhateverField(...);
...
mApi.saveCreditCard(card)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);

Получавам следната грешка:

> retrofit.RetrofitError: com.fasterxml.jackson.databind.JsonMappingException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they where created.
System.err﹕ at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
System.err﹕ at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
System.err﹕ at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265)
System.err﹕ at retrofit.RxSupport$2.run(RxSupport.java:55)
System.err﹕ at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
System.err﹕ at retrofit.Platform$Android$2$1.run(Platform.java:142)
System.err﹕ at java.lang.Thread.run(Thread.java:818)
System.err﹕ Caused by: java.lang.AssertionError: com.fasterxml.jackson.databind.JsonMappingException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they where created.

Предполагам, че RETROFIT прави сериализацията до JSON в планировчика io(), оттук и грешката.

Някой има ли предложение как мога да преодолея проблема с нишките на Realm?


person Tudor Luca    schedule 19.05.2015    source източник
comment
Изглежда, че трябва да имате модел за Realm и втори модел за Retrofit и да имате клас, за да конвертирате тези обекти един в друг.   -  person Divers    schedule 19.05.2015
comment
Имаме над 50 модела, така че това не е решение.   -  person Tudor Luca    schedule 19.05.2015
comment
Разбирам, но има голяма вероятност това да е единственото решение.   -  person Divers    schedule 19.05.2015
comment
Вероятно трябва ръчно да добавите обекта към вашето царство. Моля, погледнете раздела за модернизиране в документацията (realm.io/docs/java /последни/#други-библиотеки).   -  person geisshirt    schedule 19.05.2015
comment
@geisshirt Моля, прочетете целия текст на въпроса. Забележете CreditCard card = realm.createObject(CreditCard.class);. Изпращам обект, който е в база данни на областта, а не го извличам, оттук и заглавието, което съдържа POST в него.   -  person Tudor Luca    schedule 19.05.2015


Отговори (1)


АКТУАЛИЗАЦИЯ

Realm добави поддръжка за отделяне на обекти с помощта на realm.copyFromRealm(yourObject, depthLevel)

CreditCard creditCard = realm.createObject(CreditCard.class);
card.setWhateverField(...);
...

final int relationshipsDepthLevel = 0;
creditCard = realm.copyFromRealm(creditCard, relationshipsDepthLevel);
mApi.saveCreditCard(temporaryCard)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);

ОТХВЪРЛЕНИЯТ ОТГОВОР следва:

Намерих заобиколно решение, което изисква 2 допълнителни реда код и допълнителна стъпка за сериализиране.

@Inject
ObjectMapper mObjectMapper; // I use Dagger2 for DI

....

CreditCard creditCard = realm.createObject(CreditCard.class);
card.setWhateverField(...);
...
// I use Jackson's ObjectMapper to "copy" the original creditCard
// to a new temporary instance that has not been tied to a Realm.
String json = mObjectMapper.writeValueAsString(creditCard);
PaymentCreditCardDataView temporaryCard = mObjectMapper
                    .reader(PaymentCreditCardDataView.class)
                    .readValue(json);
mApi.saveCreditCard(temporaryCard)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);

Недостатъкът е, че имам допълнителен обект и допълнителна стъпка за сериализация+десериализация в нишката на потребителския интерфейс. Трябва да е добре, ако имам предмети с разумни размери.

person Tudor Luca    schedule 19.05.2015