2014-07-15 14 views
7

मुझे रेट्रोफिट के आरएक्सजेवा समर्थन का उपयोग करके अवलोकन करने योग्य अवलोकन के साथ परेशानी हो रही है। मैं शायद इसका गलत उपयोग कर रहा हूं कि इसका उपयोग कैसे किया जाए, अन्यथा यह रेट्रोफिट में एक बग हो सकता है। उम्मीद है कि यहां कोई व्यक्ति मुझे समझने में मदद कर सकता है कि क्या हो रहा है। संपादित करें: मैं इन प्रतिक्रियाओं के लिए MockRestAdapter का उपयोग कर रहा हूं - यह प्रासंगिक हो सकता है क्योंकि मुझे लगता है कि RxSupport कार्यान्वयन थोड़ा अलग है।चेनिंग रेट्रोफिट सेवाएं डब्ल्यू/आरएक्सजेवा समर्थन

यह एक नकली बैंकिंग ऐप है। यह एक स्थानांतरण करने की कोशिश कर रहा है, और हस्तांतरण पूरा होने के बाद, खाता खाते को अपडेट करने के लिए इसे एक खाता अनुरोध करना चाहिए। फ्लैटमैप को आजमाने के लिए यह मूल रूप से सिर्फ एक बहाना है। निम्नलिखित कोड दुर्भाग्य से काम नहीं करता है, कोई भी सदस्य नहीं कभी सूचित किया जाए:

केस 1: दो पुराना वापस का उत्पादन observables

हस्तांतरण सेवा चेनिंग (ध्यान दें: रिटर्न एक पुराना वापस का उत्पादन नमूदार):

@FormUrlEncoded @POST("/user/transactions/") 
public Observable<TransferResponse> transfer(@Field("session_id") String sessionId, 
              @Field("from_account_number") String fromAccountNumber, 
              @Field("to_account_number") String toAccountNumber, 
              @Field("amount") String amount); 

खाता सेवा (ध्यान दें: रिटर्न एक पुराना वापस का उत्पादन नमूदार):

@FormUrlEncoded @POST("/user/accounts") 
public Observable<List<Account>> getAccounts(@Field("session_id") String sessionId); 

चेन दो पुराना वापस का उत्पादन एक साथ observables:

transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount) 
      .flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() { 
       @Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) { 
        return accountsService.getAccounts(session.getSessionId()); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 

केस 2: अपने ही नमूदार बनाने और साथ चेनिंग एक पुराना वापस का उत्पादन एक

मैं के लिए रेट्रोफिट में आरएक्स समर्थन में बनाया ध्यान नहीं देते हैं " फ्लैट मैप किया गया "कॉल, यह पूरी तरह से काम करता है! सभी ग्राहकों को अधिसूचित किया जाता है। नीचे देखें:

नए खाते सेवा (ध्यान दें: एक नमूदार उत्पादन नहीं करता है):

@FormUrlEncoded @POST("/user/accounts") 
public List<Account> getAccountsBlocking(@Field("session_id") String sessionId); 

अपने ही नमूदार बनाएँ और आइटम फेंकना अपने आप:

transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount) 
      .flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() { 
       @Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) { 
        return Observable.create(new Observable.OnSubscribe<List<Account>>() { 
         @Override public void call(Subscriber<? super List<Account>> subscriber) { 
          List<Account> accounts = accountsService.getAccountsBlocking(session.getSessionId()); 
          subscriber.onNext(accounts); 
          subscriber.onCompleted(); 
         } 
        }); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 

किसी भी मदद की बहुत होगा की सराहना की!

+0

रेट्रोफिट और आरएक्सजेवा का कौन सा संस्करण आप उपयोग कर रहे हैं? –

उत्तर

5

उत्तर है हाँ आप रेट्रोफिट से श्रृंखला अवलोकन करने में सक्षम होना चाहिए। MockRestAdapter $ MockRxSupport: createMockObservable निजी क्लास में एक बग प्रतीत होता है। पर्यवेक्षक को सब्सक्राइब करने के संबंध में शेड्यूलिंग करने का तरीका गलत लगता है। पर्यवेक्षण की सदस्यता HttpExecutor थ्रेड में ही शुरू हो जाती है। मेरा मानना ​​है कि आपके शेड्यूलर्स.ओ() थ्रेड से आता है जो मूल प्रवाह पूरा हो गया है और mockHandler.invokeSync लौटाए जाने से पहले सदस्यता समाप्त हो सकती है अवलोकन योग्य की सदस्यता ली जा सकती है। उम्मीद है कि अगर आप रेट्रोफिट-मॉक मॉड्यूल में कोड को देखते हैं तो यह स्पष्टीकरण कुछ प्रकार की समझ में आता है।

रेट्रोफिट-मॉक का उपयोग करते समय वर्तमान कोड के साथ कामकाज के रूप में केवल आप आंतरिक डिफ़ॉल्ट निष्पादक को अपने स्वयं के तत्काल निष्पादक कार्यान्वयन के साथ प्रतिस्थापित कर सकते हैं। यह कम से कम जब मैक्स का परीक्षण एक थ्रेड प्रवाह होता है जो आपके शेड्यूलर्स.io द्वारा प्रदान किया जाएगा।

// ImmediateExecutor.java 
public class ImmediateExecutor implements Executor { 
    @Override 
    public void execute(Runnable command) { 
     command.run(); 
    } 
} 

// Create your RestAdapter with your ImmdiateExecutor 
RestAdapter adapter = new RestAdapter.Builder() 
      .setEndpoint(endpoint) 
      .setExecutors(new ImmediateExecutor(), null) 
      .build(); 

स्रोत पर समस्या दूर करने की के रूप में आप भी अपनी परियोजना में स्रोत के रूप में पुराना वापस-नकली परियोजना में शामिल हैं और MockRestAdapter $ MockRxSupport संशोधित कर सकते हैं: createMockObservable विधि नीचे कोड का उपयोग कर। मैंने आपके उपयोग-मामले का परीक्षण किया है और यह समस्या को ठीक करता है।

--- MockRestAdapter.java $ MockRxSupport ----

Observable createMockObservable(final MockHandler mockHandler, final RestMethodInfo methodInfo, 
     final RequestInterceptor interceptor, final Object[] args) { 
     return Observable.create(new Observable.OnSubscribe<Object>() { 
     @Override public void call(final Subscriber<? super Object> subscriber) { 
      try { 
      if (subscriber.isUnsubscribed()) return; 
      Observable observable = 
       (Observable) mockHandler.invokeSync(methodInfo, interceptor, args); 

      observable.subscribeOn(Schedulers.from(httpExecutor)); 

      //noinspection unchecked 
      observable.subscribe(subscriber); 

      } catch (RetrofitError e) { 
      subscriber.onError(errorHandler.handleError(e)); 
      } catch (Throwable e) { 
      subscriber.onError(e); 
      } 
     } 
     }); 
    } 

रेट्रोफिट परियोजना here के साथ कोई समस्या बनाया गया, यदि वे इसे स्वीकार देखेंगे।

+0

यह समझ में आता है, मैं खुद के बारे में सोच रहा था, लेकिन जब से मैं एक ही समय में रेट्रोफिट और आरएक्स दोनों सीख रहा हूं, मुझे लगा कि मैं बस गलत कर रहा था। बग दर्ज करने के लिए धन्यवाद, मैं यह देखने के लिए इसका पालन करूंगा कि वहां क्या होता है। –

+0

कोई समस्या नहीं, खुशी है कि मैं मदद कर सकता हूं। –

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