ওভারভিউ
এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে ইন্টারনেট থেকে ইমেজ ডাউনলোড করে ImageView-এ দেখানো যায়। আধুনিক অ্যাপগুলোর জন্য 써드-পার্টি লাইব্রেরি (Glide, Coil, Picasso) ব্যবহার করা সুপারিশ করা হয়।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি
Android Studio-এ নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="Load Image From URL in Android ImageView"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="24sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/text"
android:layout_marginTop="5dp" />
</RelativeLayout>
ধাপ ৩: MainActivity.kt (লিগ্যাসি AsyncTask পদ্ধতি - ডিপ্রিকেটেড)
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.AsyncTask
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Image Loading Demo"
// ⚠️ AsyncTask API 30+ এ ডিপ্রিকেটেড
DownloadImageFromInternet(findViewById(R.id.imageView)).execute(
"https://images.unsplash.com/photo-1535332371349-a5d229f49cb5?ixlib=rb-1.2.1&w=1000&q=80"
)
}
@SuppressLint("StaticFieldLeak")
@Suppress("DEPRECATION")
private inner class DownloadImageFromInternet(private val imageView: ImageView) :
AsyncTask<String, Void, Bitmap?>() {
override fun onPreExecute() {
Toast.makeText(applicationContext, "Please wait, loading image...", Toast.LENGTH_SHORT).show()
}
override fun doInBackground(vararg urls: String): Bitmap? {
val imageURL = urls[0]
return try {
val inputStream = java.net.URL(imageURL).openStream()
BitmapFactory.decodeStream(inputStream)
} catch (e: Exception) {
Log.e("ImageLoadError", e.message.toString())
e.printStackTrace()
null
}
}
override fun onPostExecute(result: Bitmap?) {
result?.let { imageView.setImageBitmap(it) }
}
}
}
ধাপ ৪: AndroidManifest.xml (ইন্টারনেট পারমিশন)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.imageload">
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
🚀 আধুনিক এবং সুপারিশ করা পদ্ধতি: Glide / Coil / Picasso
Glide ব্যবহার (সবচেয়ে জনপ্রিয়)
build.gradle (dependencies):
implementation "com.github.bumptech.glide:glide:4.16.0" kapt "com.github.bumptech.glide:compiler:4.16.0"
কোড:
Glide.with(this)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error_image)
.into(imageView)
Coil ব্যবহার (Kotlin-first, Coroutines সাপোর্ট)
build.gradle:
implementation "io.coil-kt:coil:2.5.0"
কোড (Coroutine-এ):
lifecycleScope.launch {
imageView.load("https://example.com/image.jpg") {
crossfade(true)
placeholder(R.drawable.placeholder)
error(R.drawable.error_image)
}
}
কেন AsyncTask ব্যবহার করা উচিত নয়?
- API 30 (Android 11) থেকে **ডিপ্রিকেটেড**
- মেমরি লিকের ঝুঁকি (StaticFieldLeak)
- ক্যাশিং, লাইফসাইকেল হ্যান্ডলিং, রিকোয়েস্ট ক্যেন্সেলেশন ইত্যাদি নেই
- থ্রেড পুল ম্যানেজমেন্ট জটিল
সেরা অনুশীলন
- **Glide/Coil/Picasso** ব্যবহার করুন - সেগুলো অটোমেটিক ক্যাশিং, লাইফসাইকেল আওয়্যারনেস, থ্রেডিং হ্যান্ডেল করে
- **Coroutines + Coil** কটলিন অ্যাপের জন্য সেরা পছন্দ
- বড় ইমেজের জন্য `downsample()` বা `override(width, height)` ব্যবহার করুন
- প্লেসহোল্ডার এবং এরর ইমেজ অবশ্যই সেট করুন