এই প্রশ্নটিতে ইতিমধ্যে অনেক দুর্দান্ত উত্তর রয়েছে, তবে সেই উত্তরগুলি পোস্ট হওয়ার পরে থেকে প্রচুর দুর্দান্ত গ্রন্থাগার বের হয়েছে। এটি একধরনের নবাগত-গাইড হিসাবে তৈরি।
আমি নেটওয়ার্ক ক্রিয়াকলাপ সম্পাদন করার জন্য বেশ কয়েকটি ব্যবহারের কেস এবং প্রতিটিটির জন্য একটি সমাধান বা দুটি coverেকে দেব ।
HTTP- র উপরে বিশ্রাম দিন
সাধারণত জসন, এক্সএমএল বা অন্য কিছু হতে পারে
সম্পূর্ণ 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)
স্কয়ার থেকে retrofit
এটি একাধিক এন্ডপয়েন্টস সহ একটি API এর জন্য দুর্দান্ত পছন্দ এবং আপনাকে আয়ন বা ভলির মতো অন্যান্য লাইব্রেরির মতো আলাদা আলাদাভাবে কোড করার পরিবর্তে আরএসটি শেষ পয়েন্টগুলি ঘোষণা করতে দেয়। (ওয়েবসাইট: http://square.github.io/retrofit/ )
আপনি এটি ফিনান্সিয়াস এপিআই দিয়ে কীভাবে ব্যবহার করবেন?
build.gradle
আপনার মডিউল স্তরের বিড.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
}
}
যদি আপনার এপিআই-তে কোনও API কী বা অন্য কোনও শিরোনামের মতো ব্যবহারকারী টোকেন ইত্যাদি প্রেরণের প্রয়োজন হয় তবে retrofit এটিকে সহজ করে তোলে (বিশদগুলির জন্য এই দুর্দান্ত উত্তরটি দেখুন: https://stackoverflow.com/a/42899766/1024412 )।
একমাত্র রিস্টের এপিআই অ্যাক্সেস
ধরা যাক আপনি একটি "মেজাজ আবহাওয়া" অ্যাপ্লিকেশন তৈরি করছেন যা ব্যবহারকারীদের জিপিএস অবস্থানের সন্ধান করে এবং সেই অঞ্চলের বর্তমান তাপমাত্রা পরীক্ষা করে এবং তাদের মেজাজটি জানায়। এই ধরণের অ্যাপ্লিকেশনটির API এন্ডপয়েন্টগুলি ঘোষণা করার দরকার নেই; এটিতে কেবল একটি এপিআই এর শেষ পয়েন্ট অ্যাক্সেস করতে সক্ষম হওয়া প্রয়োজন।
স্থূলাণু
এই ধরণের অ্যাক্সেসের জন্য এটি একটি দুর্দান্ত পাঠাগার।
দয়া করে এমএসমিলুর দুর্দান্ত উত্তরটি পড়ুন ( https://stackoverflow.com/a/28559884/1024412 )
HTTP- র মাধ্যমে চিত্রগুলি লোড করুন
নিক্ষেপ
ভ্যালি আরএসটি এপিআই-র জন্যও ব্যবহার করা যেতে পারে তবে আরও জটিল সেটআপের কারণে আমি উপরের স্কোয়ার থেকে রেট্রোফিট ব্যবহার করতে পছন্দ করি ( http://square.github.io/retrofit/ )
ধরা যাক আপনি একটি সামাজিক নেটওয়ার্কিং অ্যাপ তৈরি করছেন এবং বন্ধুদের প্রোফাইল ছবি লোড করতে চান।
build.gradle
আপনার মডিউল স্তরের বিড.gradle এ এই লাইন যুক্ত করুন:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
ভলির রেট্রোফিটের চেয়ে বেশি সেটআপ প্রয়োজন। একটি রিকুয়েস্টকুই, একটি ইমেজলোডার এবং একটি চিত্রক্যাচ সেটআপ করার জন্য আপনাকে এই জাতীয় শ্রেণি তৈরি করতে হবে তবে এটি খুব খারাপ নয়:
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
একটি চিত্র যুক্ত করতে আপনার লেআউট এক্সএমএল ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:
<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
অনক্রিট পদ্ধতিতে (খণ্ড, ক্রিয়াকলাপ) বা কনস্ট্রাক্টর (ডায়ালগ) -এ নিম্নলিখিত কোড যুক্ত করুন:
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/