Volley — এটি কী, Google-এর নেটওয়ার্কিং লাইব্রেরির বৈশিষ্ট্য

লেখক: IT Sectr প্রকাশিত: 2026-03-07 পড়ার সময়: 8 মিনিট

Volley হলো Android-এর জন্য Google-এর তৈরি একটি নেটওয়ার্কিং লাইব্রেরি যা দক্ষ HTTP অনুরোধ সম্পাদন এবং ইমেজ লোডিংয়ের জন্য। লাইব্রেরিটি স্বয়ংক্রিয়ভাবে থ্রেড পুল পরিচালনা করে, প্রতিক্রিয়া ক্যাশে করে এবং অনুরোধগুলিকে অগ্রাধিকার দেয়। Google, 2025-এর তথ্য অনুসারে, Volley সেই প্রকল্পগুলির জন্য একটি জনপ্রিয় পছন্দ হিসাবে রয়ে গেছে যেখানে জটিল নির্ভরতা কনফিগার না করে দ্রুত শুরু করার প্রয়োজন হয়।

মুখ্য বিষয়

  • Volley — স্বয়ংক্রিয় থ্রেড পরিচালনা সহ Android-এর জন্য Google-এর নেটওয়ার্কিং লাইব্রেরি
  • RequestQueue — অনুরোধের সারি সংগঠিত এবং সম্পাদনের জন্য কেন্দ্রীয় ক্লাস
  • ImageLoader — ক্যাশিং সহ ইমেজ লোড করার জন্য অন্তর্নির্মিত টুল
  • অগ্রাধিকার নির্ধারণ — সাধারণ, নিম্ন এবং উচ্চ অনুরোধ অগ্রাধিকারের জন্য সমর্থন
  • ক্যাশিং — পুনরাবৃত্ত অনুরোধের জন্য অন্তর্নির্মিত ডিস্ক এবং মেমোরি ক্যাশ

Volley কী?

Volley হলো Android অ্যাপ্লিকেশনে নেটওয়ার্ক যোগাযোগের জন্য একটি লাইব্রেরি, যা Google I/O 2013 সম্মেলনে উপস্থাপন করেছিল। Volley নামের অর্থ হল «একটি সালভো» — লাইব্রেরিটি একাধিক সমান্তরাল দ্রুত অনুরোধ সম্পাদনের জন্য ডিজাইন করা হয়েছে, যা UI-ভিত্তিক অ্যাপ্লিকেশনের বৈশিষ্ট্য যেখানে ইন্টারফেসের প্রতিক্রিয়ার গতি গুরুত্বপূর্ণ।

Volley কে HttpURLConnection এবং AsyncTask-এর সমস্যার সমাধান হিসেবে তৈরি করা হয়েছিল: ম্যানুয়াল থ্রেড পরিচালনা, ক্যাশিংয়ের অভাব, অনুরোধ অগ্রাধিকার নির্ধারণের জটিলতা এবং জটিল কোড। Google Volley কে «fire-and-forget» ধরনের অপারেশনের জন্য লাইব্রেরি হিসেবে স্থান দিয়েছে — ছোট অনুরোধ যার ফলাফল তাৎক্ষণিকভাবে ইন্টারফেসে প্রদর্শিত হয়।

Volley আর্কিটেকচারে তিনটি প্রধান উপাদান রয়েছে: RequestQueue (সারি ব্যবস্থাপক), CacheDispatcher (ক্যাশে করা প্রতিক্রিয়ার জন্য থ্রেড) এবং NetworkDispatcher (নেটওয়ার্ক থ্রেড)। এই আর্কিটেকচার স্বয়ংক্রিয়ভাবে অনুরোধ বিতরণ করে: প্রথমে ক্যাশে পরীক্ষা করা হয়, এবং শুধুমাত্র এর অনুপস্থিতিতে নেটওয়ার্ক অনুরোধ করা হয়। এটি পুনরাবৃত্ত ডেটার জন্য লেটেন্সি 50–80% কমিয়ে দেয়।

Volley কীভাবে কাজ করে

RequestQueue হল Volley-এর কেন্দ্রীয় ক্লাস। এতে Request<T> অবজেক্ট যোগ করা হয়, এবং সারি স্বয়ংক্রিয়ভাবে সেগুলিকে দুটি ধরনের থ্রেডে বিতরণ করে: CacheDispatcher (একটি থ্রেড, সম্ভাব্য ক্যাশে সহ অনুরোধগুলি পরিচালনা করে) এবং NetworkDispatcher (একাধিক থ্রেড, প্রকৃত HTTP অনুরোধ সম্পাদন করে)। ডিফল্টভাবে, Volley 4টি নেটওয়ার্ক থ্রেড তৈরি করে।

যখন একটি অনুরোধ যোগ করা হয়, RequestQueue পরীক্ষা করে যে এটি ক্যাশে থেকে পরিবেশন করা যায় কিনা। যদি ক্যাশে একটি আপ-টু-ডেট প্রতিক্রিয়া থাকে, CacheDispatcher তা তাৎক্ষণিকভাবে ফেরত দেয়, নেটওয়ার্ক অনুরোধ ছাড়াই। যদি ক্যাশে পুরনো হয় বা অনুপস্থিত থাকে, অনুরোধটি NetworkDispatcher-এ পাঠানো হয়। অনুরোধের অগ্রাধিকার (low, normal, high, immediate) সারির মধ্যে প্রক্রিয়াকরণের ক্রম নির্ধারণ করে — উচ্চ অগ্রাধিকারযুক্ত অনুরোধগুলি সাধারণের আগে প্রক্রিয়া করা হয়।

অনুরোধ সম্পাদনের পর, ফলাফল Handler-এর মাধ্যমে মূল থ্রেডে (UI থ্রেড) পৌঁছে দেওয়া হয়। Volley স্বয়ংক্রিয়ভাবে onResponse() এবং onErrorResponse() কলব্যাকগুলিকে মূল থ্রেডে সুইচ করে, তাই অতিরিক্ত থ্রেড স্যুইচিং ছাড়াই সরাসরি কলব্যাকে ইন্টারফেস আপডেট করা যায়। এটি কোডকে সহজ করে এবং থ্রেডিং ত্রুটির একটি সম্পূর্ণ শ্রেণী দূর করে।

Volley-এর আরেকটি বৈশিষ্ট্য হল স্বয়ংক্রিয় অনুরোধ ডিডুপ্লিকেশন। যদি একই URL এবং একই প্যারামিটার সহ দুটি অভিন্ন GET অনুরোধ সারিতে যোগ করা হয়, Volley সেগুলির মধ্যে শুধুমাত্র একটি সম্পাদন করে এবং উভয় কলব্যাকে একই প্রতিক্রিয়া ফেরত দেয়। এটি বিশেষ করে সেই স্ক্রিনগুলির জন্য উপযোগী যেখানে একাধিক উপাদান স্বাধীনভাবে একই ডেটার অনুরোধ করে — উদাহরণস্বরূপ, একটি ব্যবহারকারী প্রোফাইল যা হেডার এবং সেটিংস ফ্র্যাগমেন্ট উভয়ের জন্য একসঙ্গে প্রয়োজন।

Volley-এ অনুরোধের জীবনচক্র

প্রত্যেকটি অনুরোধ ধাপগুলির একটি ক্রমের মধ্য দিয়ে যায়: Request তৈরি করা, RequestQueue-তে যোগ করা, ক্যাশে পরীক্ষা করা (CacheDispatcher), HTTP অনুরোধ সম্পাদন করা (NetworkDispatcher), Response.Listener-এর মাধ্যমে প্রতিক্রিয়া পার্স করা, UI থ্রেডে ফলাফল পৌঁছে দেওয়া। যখন একটি অনুরোধ বাতিল করা হয় (cancel), RequestQueue এটি সারি থেকে সরিয়ে দেয় এবং কলব্যাক কল করা প্রতিরোধ করে।

Volley RetryPolicy-ও সমর্থন করে, যা ব্যর্থতার ক্ষেত্রে পুনঃচেষ্টার সংখ্যা নির্ধারণ করে। DefaultRetryPolicy ডিফল্টভাবে 2.5 সেকেন্ডের টাইমআউট সহ একটি পুনঃচেষ্টা করে। অস্থির সংযোগের জন্য, পুনঃচেষ্টার সংখ্যা 3 পর্যন্ত এবং টাইমআউট 10 সেকেন্ড পর্যন্ত বাড়ানো যেতে পারে। কাস্টম RetryPolicy RetryPolicy ইন্টারফেসের মাধ্যমে getCurrentTimeout, getCurrentRetryCount এবং retry পদ্ধতি সহ বাস্তবায়িত হয়।

Volley অনুরোধের ধরন

Volley সাধারণ ডেটা ফর্ম্যাটের জন্য প্রস্তুত অনুরোধের ধরন সরবরাহ করে। প্রতিটি ধরন বিমূর্ত ক্লাস Request<T> বাস্তবায়ন করে এবং প্রতিক্রিয়া পার্স করার একটি পদ্ধতি সংজ্ঞায়িত করে। কাস্টম ফর্ম্যাটের জন্য, আপনি parseNetworkResponse পদ্ধতি ওভাররাইড করে নিজস্ব ধরন তৈরি করতে পারেন।

অনুরোধের ধরনফেরতের ধরনউদ্দেশ্য
StringRequestStringকাঁচা টেক্সট প্রতিক্রিয়া পাওয়া
JsonObjectRequestJSONObjectJSON অবজেক্ট পার্স করা
JsonArrayRequestJSONArrayJSON অ্যারে পার্স করা
ImageRequestBitmapইমেজ লোড এবং ডিকোড করা
ClearCacheRequestVolley ক্যাশ পরিষ্কার করা

কাস্টম অনুরোধ

Gson বা Kotlinx Serialization-এর সাথে কাজ করার জন্য, আপনি একটি কাস্টম Request<T> তৈরি করতে পারেন যা parseNetworkResponse-এ নির্বাচিত পার্সার ব্যবহার করে। এটি ম্যানুয়াল JSONObject পার্সিং এড়িয়ে সরাসরি টাইপকৃত অবজেক্ট পাওয়ার অনুমতি দেয়। এই পদ্ধতি বিশেষ করে সেই প্রকল্পগুলির জন্য উপযোগী যা ইতিমধ্যে Gson বা Moshi-এর মাধ্যমে সিরিয়ালাইজেশন ব্যবহার করছে।

ডেটা পাঠানোর জন্য, Volley তিনটি বডি ধরন সমর্থন করে: JSONObject (POST পদ্ধতি সহ JsonObjectRequest-এর মাধ্যমে), Form-encoded (কনস্ট্রাক্টরে HashMap<String, String>-এর মাধ্যমে), এবং Multipart (কাস্টম MultipartRequest-এর মাধ্যমে)। ইমেজ এবং ফাইল আপলোডের জন্য Multipart অনুরোধ উপযোগী কিন্তু ম্যানুয়াল বাস্তবায়ন প্রয়োজন কারণ Volley-তে OkHttp বা Dio-এর মতো multipart/form-data-র জন্য অন্তর্নির্মিত সমর্থন নেই।

Volley-র সীমাবদ্ধতা বড় প্রতিক্রিয়া নিয়ে কাজ করার সময় লক্ষণীয় হয়। Volley কলব্যাকে পাস করার আগে সম্পূর্ণ প্রতিক্রিয়া মেমোরিতে লোড করে, যা 10–20 MB-র চেয়ে বড় JSON ফাইলের জন্য OutOfMemoryError সৃষ্টি করতে পারে। বড় ফাইল ডাউনলোডের জন্য, Volley উপযুক্ত নয় — DownloadManager বা স্ট্রিমিং ResponseBody সহ OkHttp ব্যবহার করুন। Volley বাধাগ্রস্ত ডাউনলোড (Range হেডার) পুনরায় শুরু করা সমর্থন করে না এবং রিয়েল-টাইমে Server-Sent Events বা WebSocket-এর মতো স্ট্রিমিং প্রোটোকলের সাথে কাজ করে না।

Java এবং Kotlin-এ Volley কোড উদাহরণ

আসুন একটি মৌলিক উদাহরণ দেখি — সার্ভার থেকে ডেটা আনার জন্য একটি StringRequest। প্রথমে, Volley.newRequestQueue(context)-এর মাধ্যমে RequestQueue তৈরি করা হয়। তারপর URL এবং সাফল্য ও ত্রুটির কলব্যাক সহ একটি অনুরোধ তৈরি করা হয়।

kotlin
val queue = Volley.newRequestQueue(context)

val request = StringRequest(
    Request.Method.GET,
    "https://api.github.com/users/octocat",
    { response ->
        println("প্রতিক্রিয়া: $response")
    },
    { error ->
        println("ত্রুটি: ${error.message}")
    }
)

queue.add(request)

JSON অনুরোধের জন্য, JsonObjectRequest ব্যবহার করা হয়, যা স্বয়ংক্রিয়ভাবে প্রতিক্রিয়াকে JSONObject-এ পার্স করে। Volley GET এবং POST অনুরোধ সমর্থন করে। POST-এর জন্য, অনুরোধের বডিতে একটি JSONObject পাঠানো হয়।

kotlin
val jsonBody = JSONObject()
jsonBody.put("name", "New Repo")
jsonBody.put("description", "Created via Volley")

val request = JsonObjectRequest(
    Request.Method.POST,
    "https://api.github.com/user/repos",
    jsonBody,
    { response ->
        println("তৈরি হয়েছে: ${response.getString("id")}")
    },
    { println("ত্রুটি: $it") }
)

queue.add(request)

অনুরোধ বাতিল করা

একটি অনুরোধ বাতিল করতে, cancel() পদ্ধতি বা ট্যাগ দ্বারা গ্রুপ বাতিলকরণ ব্যবহার করা হয়। বাতিল করলে, Volley onResponse বা onErrorResponse কোনোটিকেই কল করে না, যা স্ক্রিন ছেড়ে যাওয়ার পর ইন্টারফেস আপডেট প্রতিরোধ করে। এটি Activity এবং Fragment-এ মেমোরি লিক প্রতিরোধের জন্য গুরুত্বপূর্ণ।

kotlin
request.tag = "profile_request"
queue.add(request)

// স্ক্রিন ছেড়ে যাওয়ার সময় বাতিলকরণ
queue.cancelAll("profile_request")

ImageLoader এবং NetworkImageView

ImageLoader হল RequestQueue-এর উপর একটি র্যাপার ক্লাস, যা ইমেজ লোড করার জন্য অপ্টিমাইজড। এটি মেমোরি ক্যাশ (LruCache) সমর্থন করে এবং RecyclerView তালিকায় ImageView পুনরায় ব্যবহারের সময় স্বয়ংক্রিয়ভাবে অনুরোধ বাতিল করে। ImageLoader View-এর আকারে ফিট করার জন্য ইমেজ স্কেলও করে, মেমোরি বাঁচায়।

NetworkImageView একটি কাস্টম View যা ImageLoader-এর সাথে একীভূত হয় এবং স্বয়ংক্রিয়ভাবে লোডিং পরিচালনা করে: লোডিংয়ের সময় প্লেসহোল্ডার দেখায়, ব্যর্থতায় ত্রুটি দিয়ে প্রতিস্থাপন করে এবং View স্ক্রিন ছেড়ে গেলে অনুরোধ বাতিল করে। DefaultImageUrlLoader URL-এর মাধ্যমে ইমেজ লোড করে এবং দ্রুত পুনঃপ্রদর্শনের জন্য LruCache-তে সংরক্ষণ করে।

ImageLoader ব্যবহার করতে, কেবল ImageLoader(queue, ImageCache)-এর মাধ্যমে একটি ইনস্ট্যান্স তৈরি করুন, যেখানে ImageCache হল ভিতরে LruCache সহ ImageCache ইন্টারফেসের একটি বাস্তবায়ন। XML লেআউটে NetworkImageView setImageUrl() পদ্ধতির মাধ্যমে ImageLoader-এর সাথে সংযুক্ত হয়, এবং সমস্ত লোডিং প্লেসহোল্ডার এবং ত্রুটিগুলি পরিচালনার জন্য অতিরিক্ত কোড ছাড়াই সম্পূর্ণ স্বয়ংক্রিয়ভাবে ঘটে।

Volley-এর সাথে কাজ করার সময় সাধারণ ভুল

প্রতিটি Activity-তে RequestQueue তৈরি করা একটি সাধারণ ভুল যা থ্রেড দ্বৈতকরণ এবং ক্যাশে বিভ্রান্তির দিকে নিয়ে যায়। RequestQueue Application-এ একবার বা সিঙ্গলটন ক্লাসের মাধ্যমে তৈরি করার সুপারিশ করা হয়। অন্যথায়, প্রতিটি স্ক্রিনের নিজস্ব থ্রেড পুল থাকবে এবং ক্যাশ প্রতিটি সারির জন্য আলাদাভাবে সংরক্ষিত হবে।

স্ক্রিন ঘূর্ণনে অনুরোধ বাতিলকরণ উপেক্ষা করা। কনফিগারেশন পরিবর্তন হলে, Activity পুনরায় তৈরি হয় এবং পুরানো Activity-র কলব্যাক মেমোরিতে থেকে যায়। এটি লিক এবং ধ্বংস হওয়া View আপডেট করার প্রচেষ্টার দিকে নিয়ে যায়। সর্বদা Activity-নির্দিষ্ট ট্যাগ সহ onStop()-এ cancelAll()-এর মাধ্যমে অনুরোধ বাতিল করুন।

Volley HTTP/2 এবং করুটিন সমর্থন করে না — এটি ব্যবহারের ত্রুটি নয় বরং একটি আর্কিটেকচারাল সীমাবদ্ধতা। Volley 2013 সালে তৈরি হয়েছিল এবং আধুনিক প্রোটোকল এবং Kotlin করুটিন সমর্থন করে না। নতুন প্রকল্পের জন্য, Google Retrofit + OkHttp ব্যবহার করার সুপারিশ করে। Volley শুধুমাত্র লিগ্যাসি প্রকল্প সমর্থন বা ন্যূনতম নেটওয়ার্কিং প্রয়োজনীয়তা সহ সহজ অ্যাপ্লিকেশনের জন্য উপযুক্ত।

সচরাচর জিজ্ঞাসিত প্রশ্ন

2025 সালে কি Volley ব্যবহার করা উচিত?

Volley নতুন প্রকল্পের জন্য পুরনো হয়ে গেছে — Google 2017 সাল থেকে লাইব্রেরিটি আপডেট করেনি। আধুনিক অ্যাপ্লিকেশনের জন্য, Retrofit + OkHttp বা Ktor Client ব্যবহার করুন। Volley শুধুমাত্র বিদ্যমান লিগ্যাসি কোড সমর্থন বা ন্যূনতম নেটওয়ার্কিং কাজের সহজ শিক্ষামূলক প্রকল্পে ব্যবহার করা যেতে পারে।

Volley-র প্রধান ত্রুটি কী?

আধুনিক প্রযুক্তির জন্য সমর্থনের অভাব: HTTP/2, Kotlin করুটিন, মাল্টিপ্ল্যাটফর্ম ডেভেলপমেন্ট এবং টাইপকৃত সিরিয়ালাইজেশন। Volley প্রকার ছাড়া JSONObject এবং JSONArray ব্যবহার করে, যা JSON কাঠামো প্রত্যাশার সাথে মেলে না গেলে রানটাইম ত্রুটি সৃষ্টি করে।

Volley কীভাবে ইমেজ পরিচালনা করে?

ImageLoader এবং NetworkImageView-এর মাধ্যমে। ImageLoader ইমেজের মেমোরি ক্যাশিংয়ের জন্য LruCache ব্যবহার করে এবং View পুনরায় ব্যবহারের সময় স্বয়ংক্রিয়ভাবে অনুরোধ বাতিল করে। NetworkImageView লোডিংয়ের সময় একটি প্লেসহোল্ডার দেখায় এবং লোড হওয়া ইমেজ বা ত্রুটি নির্দেশক দিয়ে এটি প্রতিস্থাপন করে।

Volley কি করুটিনের সাথে ব্যবহার করা যাবে?

প্রযুক্তিগতভাবে হ্যাঁ — Volley কলব্যাকের উপর suspendCoroutine { } র্যাপারের মাধ্যমে। কিন্তু এতে কোনো সুবিধা নেই কারণ Volley করুটিন বাতিলকরণের উপর ভিত্তি করে বাতিলকরণ সমর্থন করে না এবং সরাসরি Dispatchers.IO-এর সাথে কাজ করে না। নেটিভ করুটিন সমর্থন সহ Ktor Client ব্যবহার করা ভাল।

Volley-তে টাইমআউট কীভাবে কনফিগার করবেন?

টাইমআউট RetryPolicy-এর মাধ্যমে কনফিগার করা হয়। ডিফল্টভাবে, DefaultRetryPolicy 2.5 সেকেন্ডের টাইমআউট এবং একটি পুনঃচেষ্টা ব্যবহার করে। প্যারামিটার পরিবর্তন করতে: request.retryPolicy = DefaultRetryPolicy(10000, 1, 1.0f) — 10 সেকেন্ড টাইমআউট, একটি প্রচেষ্টা।

সারসংক্ষেপ

  • Volley — স্বয়ংক্রিয় থ্রেড পরিচালনা এবং ক্যাশিং সহ Google-এর নেটওয়ার্কিং লাইব্রেরি
  • RequestQueue CacheDispatcher এবং NetworkDispatcher-এর মধ্যে অনুরোধ বিতরণ করে
  • StringRequest, JsonObjectRequest এবং ImageRequest — Volley-র অন্তর্নির্মিত অনুরোধের ধরন
  • ImageLoader LruCache-এর মাধ্যমে মেমোরি ক্যাশিং সহ ইমেজ লোড করে
  • অনুরোধ অগ্রাধিকার নির্ধারণ (low, normal, high) সারিতে সম্পাদনের ক্রম নিয়ন্ত্রণ করে
  • Volley পুরনো হয়ে গেছে — নতুন প্রকল্পের জন্য Retrofit + OkHttp বা Ktor ব্যবহার করুন
  • ট্যাগ দ্বারা অনুরোধ বাতিলকরণ মেমোরি লিক প্রতিরোধে স্ক্রিন ঘূর্ণনে বাধ্যতামূলক

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন