Picasso হল Android অ্যাপ্লিকেশনে ইমেজ লোড করার জন্য Square কোম্পানি দ্বারা তৈরি একটি লাইব্রেরি। লাইব্রেরিটি নেটওয়ার্ক থেকে গ্রাফিক্স লোড, ক্যাশ এবং প্রদর্শনের জন্য একটি সহজ ও কার্যকর API প্রদান করে। Picasso-এর GitHub পরিসংখ্যান অনুসারে, লাইব্রেরিটি 100,000-এর বেশি বার ডাউনলোড করা হয়েছে। Picasso স্বয়ংক্রিয়ভাবে মেমরি পরিচালনা করে এবং একাধিক স্তরে ইমেজ ক্যাশ করে।
মুখ্য বিষয়
Picasso হল Android-এ অ্যাসিঙ্ক্রোনাস ইমেজ লোডিংয়ের জন্য Square-এর তৈরি একটি লাইব্রেরি। শিল্পী পাবলো পিকাসোর নামে নামকরণ করা হয়েছে, যা লাইব্রেরির দর্শনকে প্রতিফলিত করে: একটি জটিল কাজকে সহজ ও মার্জিত API-তে রূপান্তর করা। এটি Android কমিউনিটিতে ইমেজ লোডিংয়ের জন্য সবচেয়ে জনপ্রিয় লাইব্রেরি।
Picasso-এর আর্কিটেকচার সর্বনিম্নবাদী: লাইব্রেরিটি লোডিংয়ের জন্য থ্রেড পুল, মেমরি ক্যাশের জন্য LruCache এবং ডিস্ক ক্যাশের জন্য DiskLruCache ব্যবহার করে। Glide-এর বিপরীতে, Picasso-তে AppGlideModule কনফিগারেশনের প্রয়োজন নেই এবং ডিপেন্ডেন্সি যোগ করার পরপরই ব্যবহারের জন্য প্রস্তুত। এটি প্রোটোটাইপ ও ছোট প্রকল্পের জন্য আদর্শ পছন্দ।
Picasso 2.8 হল সর্বশেষ স্থিতিশীল সংস্করণ, যা Android API 21+ ও Java 8+-এর সাথে সামঞ্জস্যপূর্ণ। লাইব্রেরিটির কনফিগারেশন-এর জন্য Gradle প্লাগইন বা অ্যানোটেশনের প্রয়োজন নেই, যা সংস্করণগুলোর মধ্যে মাইগ্রেশন সহজ করে এবং আপডেটের সময় ত্রুটির সম্ভাবনা কমায়। দীর্ঘ ইতিহাস সত্ত্বেও, Picasso বিশ্বজুড়ে হাজার হাজার প্রকল্পে চাহিদা ধরে রেখেছে।
Picasso-এর প্রধান কাজ হল URL-এর মাধ্যমে ইমেজ লোড করা, ডিকোড করা, প্রয়োজনে আকার পরিবর্তন করা এবং ImageView-তে প্রদর্শন করা। লাইব্রেরিটি স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ড থ্রেড, ক্যাশ এবং তালিকায় ImageView পুনঃব্যবহার পরিচালনা করে।
2013 সালে প্রকাশের পর থেকে, Picasso Android কমিউনিটিতে ইমেজ লোডিংয়ের মানদণ্ডে পরিণত হয়েছে। লাইব্রেরিটি হাজার হাজার অ্যাপ্লিকেশনে ব্যবহৃত হয় এর ন্যূনতম প্রবেশ সীমার কারণে — প্রথম ব্যবহারের জন্য কোডের মাত্র একটি লাইন যথেষ্ট।
প্রাধিকার Picasso-তে ইমেজ লোডিং ক্রম পরিচালনা করতে দেয়। ডিফল্টরূপে, সব অনুরোধের সাধারণ প্রাধিকার থাকে, কিন্তু গুরুত্বপূর্ণ ইমেজের জন্য priority মেথডের মাধ্যমে উচ্চ প্রাধিকার সেট করা যায়। যদি ImageView পুনঃব্যবহার করা হয় (যেমন, RecyclerView-এ), Picasso স্বয়ংক্রিয়ভাবে পূর্ববর্তী অনুরোধ বাতিল করে এবং নতুন একটি শুরু করে, স্ক্রোল করার সময় ইমেজ ঝিলমিল রোধ করে।
Picasso এমন বৈশিষ্ট্যের একটি সেট অফার করে যা অপ্রয়োজনীয় জটিলতা ছাড়াই মোবাইল অ্যাপ্লিকেশনে ইমেজ নিয়ে কাজের মূল পরিস্থিতিগুলো কভার করে।
Picasso-এর ক্যাশ দুটি স্তর নিয়ে গঠিত: দ্রুত অ্যাক্সেসের জন্য RAM এবং স্থায়ী সঞ্চয়ের জন্য ডিস্ক। ইমেজ অনুরোধ করলে, লাইব্রেরিটি প্রথমে মেমরি ক্যাশ, তারপর ডিস্ক এবং শুধুমাত্র তারপর নেটওয়ার্ক অনুরোধ করে। এটি বারবার লোড হওয়া ইমেজের প্রদর্শন উল্লেখযোগ্যভাবে দ্রুত করে।
ট্রান্সফর্মেশন প্রতিবার মূল ডিকোড না করেই ইমেজের আকার পরিবর্তন, ক্রপ বা ঘোরানোর অনুমতি দেয়। Picasso বিল্ট-ইন ট্রান্সফর্মেশন CenterCrop ও CenterInside প্রদান করে, এবং Transformation ইন্টারফেসের মাধ্যমে কাস্টম ট্রান্সফর্মেশন তৈরি করারও অনুমতি দেয়। ট্রান্সফর্ম করা ইমেজ আলাদাভাবে ক্যাশ করা হয়।
প্লেসহোল্ডার নেটওয়ার্ক থেকে ইমেজ লোড হওয়ার সময় প্রদর্শিত হয়, ব্যবহারকারীকে ভিজ্যুয়াল ফিডব্যাক দেয়। লোড ব্যর্থ হলে ত্রুটি ইমেজ দেখানো হয়। Picasso এমন একটি ইমেজও সমর্থন করে যা নতুন সংস্করণ লোড না হওয়া পর্যন্ত প্রদর্শিত হয়, যা আপডেটযোগ্য অবতারের জন্য উপযোগী।
Picasso URL, রিসোর্স, ফাইল, কন্টেন্ট প্রোভাইডার ও URI থেকে ইমেজ লোড সমর্থন করে। load() মেথড এই সব ধরনের জন্য ওভারলোড করা আছে, এবং লাইব্রেরি স্বয়ংক্রিয়ভাবে উৎস নির্ধারণ করে। রিসোর্স ও ফাইলের জন্য, Picasso নেটওয়ার্ক অনুরোধ করে না বরং সরাসরি ডেটা লোড করে, যা বিল্ট-ইন গ্রাফিক্সের প্রদর্শন দ্রুত করে।
Picasso RequestCreator ও Dispatcher-এর উপর ভিত্তি করে আর্কিটেকচার ব্যবহার করে। প্রতিটি অনুরোধ Picasso.get().load()-এর মাধ্যমে তৈরি হয় এবং থ্রেড পুলে নির্বাহিত হয়। Dispatcher অনুরोध সারি, প্রাধিকার এবং ImageView পুনঃব্যবহারে বাতিলকরণ পরিচালনা করে।
into(view) কল করলে, Picasso একটি Action অবজেক্ট তৈরি করে যাতে URL, ট্রান্সফর্মেশন, টার্গেট ও কলব্যাক থাকে। Action Dispatcher সারিতে স্থাপিত হয়। ইঞ্জিন Downloader (ডিফল্টরূপে OkHttp)-এর মাধ্যমে ইমেজ লোড করে, Bitmap ডিকোড করে, ট্রান্সফর্মেশন প্রয়োগ করে এবং UI থ্রেডে ফলাফল পৌঁছে দেয়। সব ইমেজ স্বয়ংক্রিয়ভাবে ImageView আকারে ফিট হয়।
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Picasso ইনস্টলেশন Gradle-এর মাধ্যমে করা হয়। লাইব্রেরিটি Maven Central-এর মাধ্যমে বিতরিত হয় এবং জটিল কনফিগারেশনের প্রয়োজন হয় না। ন্যূনতম Android API সংস্করণ 21।
মডিউল-স্তরের build.gradle ফাইলে implementation ‘com.squareup.picasso:picasso:2.8’ যোগ করুন। Gradle সিঙ্কের পর, Picasso ব্যবহারের জন্য প্রস্তুত। নেটওয়ার্ক অপারেশনের জন্য, Picasso স্বয়ংক্রিয়ভাবে OkHttp ব্যবহার করে যদি তা প্রকল্পে থাকে, অথবা বিল্ট-ইন HttpURLConnection ব্যবহার করে।
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// OkHttp থেকে লোড করার জন্য Kafka (ঐচ্ছিক)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Picasso-এর ডিবাগ নির্দেশক প্রতিটি ইমেজের কোণে একটি রঙিন ত্রিভুজ দেখায়: নেটওয়ার্ক লোডিংয়ের জন্য লাল, ডিস্ক ক্যাশের জন্য নীল, মেমরি ক্যাশের জন্য সবুজ। এটি Picasso ইনস্ট্যান্সে setIndicatorsEnabled(true) কল করে সক্রিয় করা হয়। ডিফল্ট ক্যাশ আকার ডিভাইসের উপলব্ধ মেমরির 15%।
কাস্টম Picasso ইনস্ট্যান্স কনফিগার করতে Picasso.Builder ব্যবহার করুন। এটি ব্যাকগ্রাউন্ড থ্রেডের জন্য Executor, নেটওয়ার্ক অনুরোধের জন্য Downloader, MemoryCache ও DiskCache সেট করতে দেয়। কাস্টম ইনস্ট্যান্স বিশেষ করে পরীক্ষায় উপযোগী, যেখানে Downloader-কে একটি স্টাব দিয়ে প্রতিস্থাপন করা যায় যা নেটওয়ার্ক অনুরোধ ছাড়াই ইমেজ ফেরত দেয়।
নিচের উদাহরণগুলো Picasso-এর সাথে কাজের সাধারণ পরিস্থিতি প্রদর্শন করে: একটি সাধারণ ইমেজ লোড করা, ট্রান্সফর্মেশন ব্যবহার করা এবং RecyclerView-এ লোড করা।
ImageView-এ মৌলিক লোডিং একটি মাত্র কলেই করা হয়। Picasso স্বয়ংক্রিয়ভাবে scaleType বিবেচনা করে ইমেজটি ভিউয়ের মাত্রায় ফিট করে। লোডিং সম্পূর্ণ না হওয়া পর্যন্ত প্লেসহোল্ডার দেখানো হয় এবং সংযোগ ত্রুটিতে ত্রুটি ইমেজ দেখানো হয়।
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
BlurTransformation নির্দিষ্ট ব্যাসার্ধে ইমেজকে ঝাপসা করে। কাস্টম ট্রান্সফর্মেশন transform মেথডের সাথে Transformation ইন্টারফেস ইমপ্লিমেন্ট করে। ক্যাশ পুনরায় প্রয়োগ এড়াতে ট্রান্সফর্মেশন ফলাফল একটি অনন্য কী-এর অধীনে সংরক্ষণ করে।
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// ব্লার প্রয়োগ করা
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
RecyclerView-এ, Picasso স্বয়ংক্রিয়ভাবে সেই ImageViews-এর জন্য অনুরোধ বাতিল করে যা স্ক্রিন থেকে স্ক্রোল হয়ে গেছে এবং ইতিমধ্যে লোড করা ইমেজ পুনঃব্যবহার করে। এটি মেমরি লিক প্রতিরোধ করে এবং মসৃণ স্ক্রোলিং নিশ্চিত করে।
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Android-এর জন্য ইমেজ লোডিং লাইব্রেরি বাছাই করার সময় Picasso ও Glide-এর তুলনা একটি সাধারণ প্রশ্ন। উভয় লাইব্রেরি একই কাজ সমাধান করে কিন্তু ভিন্ন প্রাধিকার ও ব্যবহার বৈশিষ্ট্য রয়েছে।
Picasso সেই প্রকল্পের জন্য বেশি উপযুক্ত যেখানে সরলতা ও ন্যূনতম APK আকার গুরুত্বপূর্ণ। Glide বাছাই করা হয় যখন GIF সমর্থন, ভিডিও ফ্রেম এবং সর্বোচ্চ মেমরি অপ্টিমাইজেশনের প্রয়োজন হয়। Glide স্বয়ংক্রিয়ভাবে ইমেজকে সঠিক ImageView আকারে স্কেল করে, যা কিছু পরিস্থিতিতে Picasso-এর তুলনায় মেমরি খরচ 50% পর্যন্ত কমায়।
কর্মক্ষমতা পরীক্ষায়, Glide তার প্রিলোডিং প্রক্রিয়া ও দ্রুত স্ক্রোলিংয়ের সময় স্বয়ংক্রিয় অনুরোধ বাতিলের কারণে RecyclerView-এর সাথে কাজ করার সময় ভালো ফলাফল দেখায়। Picasso একটি সরল কৌশল ব্যবহার করে, যা এটিকে পূর্বাভাসযোগ্য但 বড় ডেটা ভলিউমে কম কার্যকর করে।
Picasso API সরলতা ও ন্যূনতম আকারে মনোযোগ দেয়। Glide বিস্তৃত কার্যকারিতা অফার করে: GIFs, অ্যানিমেটেড ইমেজ, ভিডিও ফ্রেম এবং লাইফসাইকেল ইন্টিগ্রেশনের সমর্থন। Glide ImageView আকারে স্বয়ংক্রিয় স্কেলিংয়ের কারণে আরও কার্যকরভাবে মেমরি পরিচালনা করে।
| নির্ণায়ক | Picasso | Glide |
|---|---|---|
| লাইব্রেরির আকার | ~120 KB | ~500 KB |
| GIF সমর্থন | না | হ্যাঁ |
| ভিডিও ফ্রেম | না | হ্যাঁ |
| ডেভেলপার | Square | Google (Bumptech) |
| API | Fluent চেইন | RequestBuilder |
Android Developer Relations-এর মতে, Google নতুন প্রকল্পে ইমেজ লোডিংয়ের জন্য Glide-কে পছন্দের লাইব্রেরি হিসেবে সুপারিশ করে। Picasso সহজ প্রকল্পের জন্য একটি চমৎকার পছন্দ হিসেবে রয়ে গেছে যেখানে GIFs ও ভিডিও ফ্রেমের প্রয়োজন নেই।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Picasso আকারে ছোট এবং ব্যবহারে সহজ। Glide GIFs ও ভিডিও ফ্রেম সমর্থন করে, মেমরি আরও কার্যকরভাবে পরিচালনা করে এবং Google দ্বারা সুপারিশকৃত। পছন্দ অতিরিক্ত ফরম্যাটের জন্য প্রকল্পের প্রয়োজনীয়তার উপর নির্ভর করে।
Picasso ক্যাশ পরিষ্কার করতে, একটি ইমেজের জন্য Picasso.get().invalidate(url) মেথড বা সম্পূর্ণ পরিষ্কারের জন্য shutdown() ব্যবহার করুন। ডিস্ক ক্যাশ অ্যাপ পুনঃইনস্টল করলে বা সিস্টেম সেটিংসের মাধ্যমে মুছে যায়।
Picasso স্ক্রিন রোটেশনের উপর নির্ভর করে না। লোড করা ইমেজ ক্যাশে সংরক্ষিত থাকে এবং Activity পুনঃনির্মাণে সেখান থেকে প্রদর্শিত হয়। গতি বাড়াতে, লোড করা ডেটা সংরক্ষণ করতে Picasso-এর সাথে ViewModel ব্যবহার করুন।
হ্যাঁ, Picasso Kotlin-এর সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ। Kotlin ডেভেলপাররা আরও সংক্ষিপ্ত সিনট্যাক্সের জন্য এক্সটেনশন ফাংশন ব্যবহার করতে পারেন বা ইমেজ লোড করার সময় null মান হ্যান্ডেল করার জন্য koptional লাইব্রেরি প্রয়োগ করতে পারেন।
Picasso মেমরি ক্যাশের জন্য LruCache ব্যবহার করে, স্বয়ংক্রিয়ভাবে অব্যবহৃত ইমেজ পরিষ্কার করে। ডিফল্ট ক্যাশ আকার অ্যাপের উপলব্ধ মেমরির 15%। মেমরি কম হলে, Picasso onTrimMemory-এর মাধ্যমে রিসোর্স মুক্ত করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন