2015-03-28 8 views
8

अंदर मैं हाल ही में एक Android ऐप्लिकेशन के विकास शुरू कर दिया है और एक बाकी सेवा के एक ग्राहक के रूप में रेट्रोफिट उपयोग करने के लिए फैसला किया, लेकिन मुझे यकीन है कि अगर मेरे दृष्टिकोण अच्छा है नहीं कर रहा हूँ:रेट्रोफिट कॉल AsyncTask

मैं। मैंने अपने एपीआई को एक एसिंक्रोनस कॉल लागू किया है, जिसे AsyncTask की doInBackground विधि के अंदर बुलाया जाता है। चिंता: this article पढ़कर मुझे उलझन में मिला। AsyncTasks इस तरह के कार्यों के लिए उपयुक्त नहीं हैं? क्या मुझे एपीआई को सीधे गतिविधि से कॉल करना चाहिए? मैं समझता हूं कि यूआर थ्रेड पर रेट्रोफिट की कॉलबैक विधियां निष्पादित की जाती हैं, लेकिन HTTP पर कॉल के बारे में कैसे? क्या रेट्रोफिट उस के लिए धागे बनाते हैं?

ii। मैं AuthenticationResponse को SharePreferences ऑब्जेक्ट के अंदर सहेजना चाहता हूं, जो कॉलबैक की सफलता विधि के अंदर उपलब्ध नहीं प्रतीत होता है। कोई सुझाव/अच्छी प्रथाओं?

  • synchronic

आप:

@Override 
    protected String doInBackground(String... params) { 
     Log.d(LOCATION_LOGIN_TASK_TAG, params[0]); 

     LocationApi.getInstance().auth(new AuthenticationRequest(params[0]), new Callback<AuthenticationResponse>() { 

      @Override 
      public void success(AuthenticationResponse authenticationResponse, Response response) { 
       Log.i("LOCATION_LOGIN_SUCCESS", "Successfully logged user into LocationAPI"); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Log.e("LOCATION_LOGIN_ERROR", "Error while authenticating user in the LocationAPI", error); 
      } 
     }); 
     return null; 
    } 

उत्तर

27

मैं रेट्रोफिट एक अनुरोध बनाने के तीन तरीके का समर्थन करता है:

अग्रिम :)

यहाँ से धन्यवाद मेरी doInBackGroundMethod है विधि को घोषित करना है जो पूर्व के लिए मूल्य के रूप में प्रतिक्रिया देता है पर्याप्त:

@GET("/your_endpoint") 
    AuthenticationResponse auth(@Body AuthenticationRequest authRequest); 

यह विधि थ्रेड में किया जाता है जिसमें कहा जाता है। तो आप इसे मुख्य/यूआई थ्रेड में कॉल नहीं कर सकते हैं।

  • अतुल्यकालिक

आप शून्य विधि है जो उदाहरण के लिए पिछले परम के रूप में प्रतिक्रिया के साथ कॉलबैक शामिल घोषित करने के लिए है:

@GET("/your_endpoint") 
    voud auth(@Body AuthenticationRequest authRequest, Callback<AuthenticationResponse> callback); 

अनुरोध के निष्पादन के नए पृष्ठभूमि सूत्र में कहा जाता है, और कॉलबैक विधियों को थ्रेड में किया जाता है जिसे विधि कहा जाता है। तो आप इस विधि को मुख्य थ्रेड/AsyncTask के बिना मुख्य/यूआई थ्रेड में कॉल कर सकते हैं।

  • RxAndroid

पिछले जिस तरह मैं जानता हूँ कि विधि है जो RxAndroid का उपयोग करता है का उपयोग करना। आपको विधि घोषित करना है जो मूल्य के साथ देखने योग्य प्रतिक्रिया देता है। उदाहरण के लिए:

@GET("/your_endpoint") 
    Observable<AuthenticationResponse> auth(@Body AuthenticationRequest authRequest); 

यह विधि नए धागे में नेटवर्क अनुरोध करने के लिए भी समर्थन करती है। तो आपको नया धागा/AsyncTask बनाने की ज़रूरत नहीं है। सब्सक्राइब विधि से एक्शन 1 कॉलबैक यूआई/मुख्य थ्रेड में कहा जाता है।

II। आप अपनी विधि को केवल गतिविधि में कॉल कर सकते हैं और आप नीचे दिखाए गए अनुसार साझा डेटा को साझा कर सकते हैं:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
sharedPreferences.edit() 
      .put...//put your data from AuthenticationResponse 
        //object which is passed as params in callback method. 
      .apply(); 
+0

धन्यवाद आपके उत्तर कोनराड के लिए बहुत कुछ। मैं अनिश्चित था कि दृश्यों के पीछे रेट्रोफिट क्या कर रहा था।सबसे पहले मैं एक AsyncTask में नेटवर्क कॉल कर रहा था जो कि शेयरप्रेरेंस उदाहरण का उपयोग करने के लिए एक ओवरकिल और मुश्किल है। बहुत अच्छा और सूचनात्मक उत्तर – user3159152

+0

आपका स्वागत है मुझे खुशी है कि मैं आपकी मदद कर सकता हूं। यदि यह आपके लिए उपयोगी है तो कृपया इसे स्वीकार करें। बस चेकबॉक्स –

+0

बहुत अच्छी स्पष्टीकरण चिह्नित करें। – Andrain