परिचय
नेटवर्क ऑपरेशन मुख्य थ्रेड पर नहीं किए जा सकते। यह लेख `AsyncTask` का उपयोग करके पृष्ठभूमि में इमेज डाउनलोड करने और `ImageView` में दिखाने का तरीका दिखाता है (नोट: `AsyncTask` API 30 में पदावनत है; आधुनिक ऐप्स में Coroutines, RxJava, या Retrofit का उपयोग करें)।
कार्यान्वयन
चरण 1: लेआउट (activity_main.xml)
<ImageView android:id="@+id/image" android:layout_centerInParent="true" ... /> <Button android:id="@+id/button" android:text="@string/button" android:layout_below="@id/image" ... />
चरण 2: strings.xml
<string name="button">Download Image</string>
चरण 3: MainActivity.java
public class MainActivity extends AppCompatActivity {
String url = "https://images.pexels.com/photos/1226302/pexels-photo1226302.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500";
ImageView image;
Button button;
ProgressDialog mProgressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = findViewById(R.id.image);
button = findViewById(R.id.button);
button.setOnClickListener(v -> new DownloadImage().execute(url));
}
private class DownloadImage extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setTitle("Download Image Tutorial");
mProgressDialog.setMessage("Loading...");
mProgressDialog.show();
}
@Override
protected Bitmap doInBackground(String... URL) {
try {
InputStream input = new java.net.URL(URL[0]).openStream();
return BitmapFactory.decodeStream(input);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
image.setImageBitmap(result);
mProgressDialog.dismiss();
}
}
} चरण 4: AndroidManifest.xml में इंटरनेट अनुमति
<uses-permission android:name="android.permission.INTERNET" />
व्याख्या
- `doInBackground` पृष्ठभूमि थ्रेड पर चलता है और नेटवर्क से इमेज डाउनलोड करता है।
- `onPreExecute` और `onPostExecute` UI थ्रेड पर चलते हैं (प्रोग्रेस डायलॉग दिखाने/छिपाने के लिए)।
- `BitmapFactory.decodeStream` इनपुट स्ट्रीम को बिटमैप में डिकोड करता है।
आधुनिक विकल्प: कोरआउटिन्स + `withContext(Dispatchers.IO)` या Glide/Picasso/Coil जैसी लाइब्रेरी।