उदाहरण में जाने से पहले, हमें पता होना चाहिए कि AsyncTask क्या है। AsyncTask बैकग्राउंड थ्रेड में ऑपरेशन/एक्शन करता है और मेन थ्रेड पर अपडेट करता है। यहां Android AsyncTask समानांतर निष्पादन के बारे में सरल समाधान है।
AsyncTask समानांतर निष्पादन का उदाहरण
चरण 1 - नया प्रोजेक्ट बनाएं
Android Studio में एक नया प्रोजेक्ट बनाएं: File → New Project पर जाएं और आवश्यक विवरण भरें।
चरण 2 - लेआउट XML में कोड जोड़ें
res/layout/activity_main.xml में निम्नलिखित कोड जोड़ें:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:id="@+id/rootview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#c1c1c1"
android:gravity="center_horizontal"
tools:context=".MainActivity">
<Button
android:id="@+id/asyncTask"
android:text="Download"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="300dp" />
<ImageView
android:id="@+id/image2"
android:layout_width="300dp"
android:layout_height="300dp" />
</LinearLayout>
उपरोक्त कोड में हमने दो ImageViews और एक बटन घोषित किया है। जब उपयोगकर्ता बटन पर क्लिक करता है, तो यह दो अलग-अलग इंटरनेट स्रोतों से इमेज डाउनलोड करेगा और ImageViews में जोड़ देगा।
चरण 3 - MainActivity.java में कोड जोड़ें
src/MainActivity.java में निम्नलिखित कोड जोड़ें:
package com.example.andy.myapplication;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private ImageView imageView, imageView2;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.asyncTask);
imageView = findViewById(R.id.image);
imageView2 = findViewById(R.id.image2);
button.setOnClickListener(v -> {
new AsyncTaskExample2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
"https://www.tutorialspoint.com/cprogramming/images/logo.png");
new AsyncTaskExample().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
"https://www.tutorialspoint.com/images/tp-logo-diamond.png");
});
}
private class AsyncTaskExample extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Downloading...");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected Bitmap doInBackground(String... strings) {
try {
URL imageUrl = new URL(strings[0]);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeStream(is, null, options);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
if (bitmap != null && imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
private class AsyncTaskExample2 extends AsyncTask {
@Override
protected Bitmap doInBackground(String... strings) {
try {
URL imageUrl = new URL(strings[0]);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeStream(is, null, options);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (bitmap != null && imageView2 != null) {
imageView2.setImageBitmap(bitmap);
}
}
}
}
उपरोक्त कोड में, हमने दो या अधिक AsyncTask चलाने के लिए executeOnExecutor() का उपयोग किया है। Android अधिकतम पांच AsyncTask को समानांतर चलाने का समर्थन करता है।
चरण 4 - Manifest में परमिशन जोड़ें
AndroidManifest.xml में इंटरनेट परमिशन जोड़ें:
<uses-permission android:name="android.permission.INTERNET"/>
ऐप चलाएं
अपने Android डिवाइस को कंप्यूटर से कनेक्ट करें और ऐप चलाएं। बटन पर क्लिक करने पर, यह प्रोग्रेस बार के साथ इंटरनेट स्रोत से इमेज डाउनलोड करेगा और दोनों इमेज समानांतर में प्रदर्शित करेगा।
महत्वपूर्ण: Android 11 (API 30) से AsyncTask डिप्रिकेटेड है। आधुनिक ऐप्स के लिए
Coroutines,ExecutorService, याRxJavaका उपयोग समानांतर निष्पादन के लिए करें।