2016-02-29 2 views
5

रेट्रोफिट 1.x में मैंने एपीआई सेवा कक्षाएं बनाने के लिए निम्न पैटर्न का उपयोग किया जो कुछ निर्माण प्रकारों के लिए खराब नेटवर्क कनेक्शन अनुकरण करता था।रेट्रोफिट 2 के साथ खराब नेटवर्क सिम्युलेट करें (वास्तविक, यानी गैर-मजाक, एपीआई)

// Retrofit 1 
private <T> T create(Class<T> apiServiceClass) { 
    T apiService = restAdapter.create(apiServiceClass); 
    if (!BuildConfig.IS_PRODUCTION_BUILD) { 
     endpoints = mockRestAdapter.create(apiServiceClass, apiService); 
    } 
    return apiService; 
} 

इस बारे में अच्छी बात यह है कि मेरे वास्तविक एपीआई एंडपॉइंट्स का उपयोग किया जाता है। इस तरह से मैं देख सकता हूं कि ऐप एक फ्लैकी कनेक्शन पर कैसे व्यवहार करता है और मुझे मजाक/कृत्रिम प्रतिक्रिया प्रदान करने की आवश्यकता नहीं है।

अब, रेट्रोफिट 2 में MockRestAdapter या MockRetrofit के लिए एपीआई पूरी तरह बदल गया है। MockRetrofit#create अब BehaviorDelegate देता है। मैं

से पहले
// Retrofit 2 
private <T> T create(Class<T> apiServiceClass) { 
    T apiService = retrofit.create(apiServiceClass); 
    if (!BuildConfig.IS_PRODUCTION_BUILD) { 
     endpoints = mockRetrofit.create(apiServiceClass).returning(???); 
    } 
    return apiService; 
} 

मैं returning(???) पर अटक जाते हैं के रूप में एक ही पैटर्न का उपयोग करने का प्रयास करें। returningCall<?> कार्यान्वयन की अपेक्षा करता है। लेकिन मुझे लगता है कि यह मेरे रेट्रोफिट 1 उदाहरण (शायद इसका इरादा नहीं है) जैसे काम करने के लिए इसे कार्यान्वित करने के तरीके को समझने के लिए प्रतीत नहीं होता है।

तो मेरा सवाल यह है कि: सामान्य रूप से, मैं रेट्रोफिट 2 के साथ एक वास्तविक एपीआई पर खराब नेटवर्क को अनुकरण करने के लिए उपर्युक्त रेट्रोफिट 1 पैटर्न कैसे प्राप्त कर सकता हूं?

उत्तर

6

आखिर में मैंने इसे समझ लिया। विचार ओकेएचटीपी के अनुप्रयोग इंटरसेप्टर का उपयोग करना है। यहां समाधान है।

सबसे पहले, NetworkBehavior बनाएं।

final NetworkBehavior behavior = NetworkBehavior.create(); 
behavior.setDelay(2000, TimeUnit.MILLISECONDS); 
behavior.setFailurePercent(50); 
behavior.setVariancePercent(50); 
बेशक

आप एक UI घटक को behavior प्रदान गतिशील इन मूल्यों को बदलने के लिए कर सकते हैं।

OkHttpClient को कॉन्फ़िगर करते समय निम्न इंटरसेप्टर जोड़ें।

final OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
if (!BuildConfig.IS_PRODUCTION_BUILD) { 
    builder.addInterceptor(new HttpLoggingInterceptor()); 
    builder.addInterceptor(new Interceptor() { 
     @Override public Response intercept(Chain chain) throws IOException { 
      try { 
       Thread.sleep(behavior.calculateDelay(TimeUnit.MILLISECONDS)); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      if (behavior.calculateIsFailure()) { 
       return new Response.Builder() 
         .code(500) 
         .message("MockError") 
         .protocol(Protocol.HTTP_1_1) 
         .request(chain.request()) 
         .body(ResponseBody.create(MediaType.parse("text/plain"), "MockError")) 
         .build(); 
      } 
      return chain.proceed(chain.request()); 
     } 
    }); 
} 

ध्यान दें कि आप से पहले एक प्रवेश इंटरसेप्टर जोड़ना चाहिए ताकि अनुरोध लॉग ठीक से दिखाई जाती हैं। मैन्युअल रूप से बनाई गई प्रतिक्रिया ऑब्जेक्ट को निश्चित रूप से आपकी पसंद के अनुसार अनुकूलित किया जा सकता है। कुछ मान अनिवार्य हैं (उदा। या request)। यदि आप उन्हें निर्दिष्ट नहीं करते हैं तो आपको एनपीई प्राप्त होंगे। वही दृष्टिकोण वास्तव में रेट्रोफिट 1 के लिए भी काम करेगा।

+1

बिल्कुल जो मैं खोजता हूं। धन्यवाद! – user1795683

+1

उत्तर देने के लिए सबसे पहले धन्यवाद। मैं भी 'मॉकरेट्रोफिट' के साथ समस्या को हल करने की उम्मीद कर रहा था। मैं आपके जैसा कुछ कर रहा था। लेकिन यदि आप इसके बजाय 'ओकेएचटीपी' इंटरसेप्टर 'का उपयोग करके अपना खुद का रोलिंग कर रहे हैं, तो आप अपनी खुद की' नेटवर्कबिहियर 'कक्षा भी लिख सकते हैं जो आपको चाहिए। अन्यथा, आप एक वर्ग पर दो विधियों का उपयोग करने के लिए पूरे 'रेट्रोफिट-मॉक' lib पर भरोसा कर रहे हैं। – tir38

+0

build.gradle में निर्भरता 'compile' com.squareup.retrofit2 है: retrofit-mock: 2.3.0'' (वर्तमान में संस्करण 2.3.0) –

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