2015-05-19 8 views
12

मैं निम्नलिखित RETROFIT एपीआई है:RETROFIT पोस्ट क्षेत्र वस्तु

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

CreditCard एक RealmObject है।

जब मैं अपने एपीआई विधि का उपयोग करने का प्रयास करें:

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 io() अनुसूचक पर JSON को क्रमबद्धता कर रही है यह सोचते हैं हूँ इसलिए, त्रुटि।

क्या किसी के पास कोई सुझाव है कि मैं रीयलम की थ्रेडिंग समस्या को कैसे दूर कर सकता हूं?

+0

लगता है कि आपके पास रीयलम के लिए मॉडल और रेट्रोफिट के लिए दूसरा मॉडल होना चाहिए और कक्षाओं को एक दूसरे से "कन्वर्ट" करने के लिए कक्षा है। – Divers

+0

हमारे पास 50 से अधिक मॉडल हैं, इसलिए यह वास्तव में एक समाधान नहीं है। –

+0

मैं समझता हूं, लेकिन बड़ा मौका यह है कि यह केवल समाधान है। – Divers

उत्तर

7

अद्यतन

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

DEPRECATED उत्तर का उपयोग करके वस्तुओं को अलग करने के लिए समर्थन जोड़ा इस प्रकार है:

मैं एक समाधान है कि कोड के 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(...); 

नकारात्मकता यह है कि मेरे पास यूआई थ्रेड पर अतिरिक्त ऑब्जेक्ट और अतिरिक्त क्रमबद्धता + deserialisation चरण है। अगर मेरे पास उचित आकार वाले ऑब्जेक्ट हैं तो यह ठीक होना चाहिए।

+1

चालाक समाधान – Loki

संबंधित मुद्दे