Android 改造后领域对象

Android 改造后领域对象,android,retrofit,realm,Android,Retrofit,Realm,我有以下改装API: @POST("/payments") Observable<Response> saveCreditCard(@Body CreditCard creditCard) 我得到以下错误: > retrofit.RetrofitError: com.fasterxml.jackson.databind.JsonMappingException: Realm access from incorrect thread. Realm objects can

我有以下改装API:

@POST("/payments")    
Observable<Response> saveCreditCard(@Body CreditCard creditCard)
我得到以下错误:

> 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.
我假设改型正在对
io()
调度程序上的
JSON
进行序列化,因此出现了错误


有人对我如何克服Realm的线程问题有什么建议吗?

更新

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(...);

缺点是我在UI线程上有一个额外的对象和一个额外的序列化+反序列化步骤。如果我有大小合理的对象就可以了。

似乎你必须有Realm的模型和第二个模型进行改装,并且有类来“转换”这些对象。我们有50多个模型,所以这不是一个真正的解决方案。我理解,但很可能这是唯一的解决方案。您可能需要手动将对象添加到您的领域。请查看文档()中的“改装”部分。@geisshirt请阅读问题的全文。注意“CreditCard=realm.createObject(CreditCard.class);”。我发送的是一个领域数据库中的对象,而不是检索它,因此标题中有“POST”。
@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(...);