इस सवाल पर कई शानदार जवाब पहले से ही हैं, लेकिन उन जवाबों को पोस्ट किए जाने के बाद से बहुत सारे महान पुस्तकालय सामने आए हैं। यह एक प्रकार का नौसिखिया-मार्गदर्शक है।
मैं नेटवर्क संचालन और प्रत्येक के लिए एक समाधान या दो प्रदर्शन के लिए कई उपयोग मामलों को कवर करूंगा ।
HTTP पर ReST
आमतौर पर Json, XML या कुछ और हो सकता है
पूर्ण एपीआई पहुंच
मान लीजिए कि आप एक ऐसा ऐप लिख रहे हैं जो उपयोगकर्ताओं को स्टॉक की कीमतों, ब्याज दरों और क्यूरेसी एक्सचेंज दरों को ट्रैक करने देता है। आपको एक Json API मिलती है जो कुछ इस तरह दिखती है:
http://api.example.com/stocks //ResponseWrapper<String> object containing a list of Srings with ticker symbols
http://api.example.com/stocks/$symbol //Stock object
http://api.example.com/stocks/$symbol/prices //PriceHistory<Stock> object
http://api.example.com/currencies //ResponseWrapper<String> object containing a list of currency abbreviation
http://api.example.com/currencies/$currency //Currency object
http://api.example.com/currencies/$id1/values/$id2 //PriceHistory<Currency> object comparing the prices of the first currency (id1) to the second (id2)
स्क्वायर से रेट्रोफिट
यह कई एंडपॉइंट्स के साथ एपीआई के लिए एक उत्कृष्ट विकल्प है और आपको आयन या वॉली जैसे अन्य पुस्तकालयों के साथ व्यक्तिगत रूप से कोड करने के बजाय रेस्ट एंडपॉइंट घोषित करने की अनुमति देता है। (वेबसाइट: http://square.github.io/retrofit/ )
आप वित्त एपीआई के साथ इसका उपयोग कैसे करते हैं?
build.gradle
अपने मॉड्यूल स्तर buid.gradle में इन पंक्तियों को जोड़ें:
implementation 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit library, current as of September 21, 2017
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //gson serialization and deserialization support for retrofit, version must match retrofit version
FinancesApi.java
public interface FinancesApi {
@GET("stocks")
Call<ResponseWrapper<String>> listStocks();
@GET("stocks/{symbol}")
Call<Stock> getStock(@Path("symbol")String tickerSymbol);
@GET("stocks/{symbol}/prices")
Call<PriceHistory<Stock>> getPriceHistory(@Path("symbol")String tickerSymbol);
@GET("currencies")
Call<ResponseWrapper<String>> listCurrencies();
@GET("currencies/{symbol}")
Call<Currency> getCurrency(@Path("symbol")String currencySymbol);
@GET("currencies/{symbol}/values/{compare_symbol}")
Call<PriceHistory<Currency>> getComparativeHistory(@Path("symbol")String currency, @Path("compare_symbol")String currencyToPriceAgainst);
}
FinancesApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
फाइनेंसफ्रेगमेंट स्निपेट
FinancesApi api = FinancesApiBuilder.build("http://api.example.com/"); //trailing '/' required for predictable behavior
api.getStock("INTC").enqueue(new Callback<Stock>(){
@Override
public void onResponse(Call<Stock> stockCall, Response<Stock> stockResponse){
Stock stock = stockCall.body();
//do something with the stock
}
@Override
public void onResponse(Call<Stock> stockCall, Throwable t){
//something bad happened
}
}
यदि आपके एपीआई को भेजने के लिए एक एपीआई कुंजी या उपयोगकर्ता टोकन जैसे अन्य शीर्षलेख की आवश्यकता होती है, तो रिट्रोफिट यह आसान बनाता है (विवरण के लिए यह भयानक उत्तर देखें: https://stackoverflow.com/a/42899766/1024412 )।
ReST API एक्सेस को बंद कर देता है
मान लीजिए कि आप एक "मूड वेदर" ऐप बना रहे हैं जो उपयोगकर्ताओं को जीपीएस लोकेशन दिखता है और उस क्षेत्र के वर्तमान तापमान की जाँच करता है और उन्हें मूड बताता है। इस प्रकार के ऐप को एपीआई एंडपॉइंट घोषित करने की आवश्यकता नहीं है; यह बस एक एपीआई समापन बिंदु का उपयोग करने में सक्षम होने की जरूरत है।
आयन
इस प्रकार की पहुँच के लिए यह एक महान पुस्तकालय है।
कृपया msysmilu का शानदार उत्तर पढ़ें ( https://stackoverflow.com/a/28559884/1024412 )
HTTP के माध्यम से छवियों को लोड करें
फ़ायर
वॉली का उपयोग रीस्ट एपीआई के लिए भी किया जा सकता है, लेकिन अधिक जटिल सेटअप के कारण मुझे आवश्यक है कि ऊपर से स्क्वायर से रिट्रोफिट का उपयोग करना पसंद करें ( http://square.github.io/retrofit/ )
मान लीजिए कि आप एक सोशल नेटवर्किंग ऐप बना रहे हैं और दोस्तों की प्रोफाइल पिक्चर लोड करना चाहते हैं।
build.gradle
इस लाइन को अपने मॉड्यूल स्तर buid.gradle में जोड़ें:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
वॉली को रेट्रोफिट से अधिक सेटअप की आवश्यकता है। आपको RequestQueue, ImageLoader और ImageCache सेटअप करने के लिए इस तरह एक वर्ग बनाने की आवश्यकता होगी, लेकिन यह बहुत बुरा है:
public class ImageFetch {
private static ImageLoader imageLoader = null;
private static RequestQueue imageQueue = null;
public static ImageLoader getImageLoader(Context ctx){
if(imageLoader == null){
if(imageQueue == null){
imageQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
imageLoader = new ImageLoader(imageQueue, new ImageLoader.ImageCache() {
Map<String, Bitmap> cache = new HashMap<String, Bitmap>();
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
return imageLoader;
}
}
user_view_dialog.xml
छवि जोड़ने के लिए अपने लेआउट xml फ़ाइल में निम्न जोड़ें:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/profile_picture"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
app:srcCompat="@android:drawable/spinner_background"/>
UserViewDialog.java
निम्नलिखित कोड onCreate मेथड (Fragment, Activity) या कंस्ट्रक्टर (डायलॉग) में जोड़ें:
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
पिकासो
स्क्वायर से एक और उत्कृष्ट पुस्तकालय। कृपया कुछ महान उदाहरणों के लिए साइट देखें: http://square.github.io/picasso/