অ্যান্ড্রয়েডে Volley লাইব্রেরি দিয়ে JSON Array প্রসেসিং এবং AbstractList ব্যবহার
এই টিউটোরিয়ালে শিখব কিভাবে Volley নেটওয়ার্ক লাইব্রেরি ব্যবহার করে রিমোট JSON API থেকে ডেটা ফেচ করে, সেগুলো কাস্টম অবজেক্টে পার্স করে AbstractList (ArrayList) এ সংরক্ষণ এবং সর্ট করা যায়।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project নির্বাচন করে প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল
res/layout/activity_main.xml ফাইলে:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="16dp" />
</LinearLayout>
ধাপ ৩: build.gradle-এ ডিপেন্ডেন্সি যোগ করুন
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.volley:volley:1.2.1' // লেটেস্ট ভার্সন
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
নোট: `volley:1.1.0` পুরানো, `1.2.1` বা নতুনতম ভার্সন ব্যবহার করুন।
ধাপ ৪: ম্যানিফেস্টে ইন্টারনেট পারমিশন
AndroidManifest.xml ফাইলে:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
ধাপ ৫: জাভা কোড (MainActivity.java)
package com.example.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView textView;
RequestQueue queue;
String URL = "https://mocki.io/v1/0c9b9c3a-1234-4567-89ab-cdef12345678"; // আপডেট করা URL
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
// AbstractList ব্যবহার (ArrayList AbstractList ইমপ্লিমেন্ট করে)
final AbstractList list = new ArrayList<>();
queue = Volley.newRequestQueue(this);
StringRequest request = new StringRequest(Request.Method.GET, URL,
new Response.Listener() {
@Override
public void onResponse(String response) {
try {
JSONObject object = new JSONObject(response);
JSONArray array = object.getJSONArray("users");
for (int i = 0; i < array.length(); i++) {
JSONObject userObj = array.getJSONObject(i);
String name = userObj.getString("name");
String id = userObj.getString("id");
list.add(new UserInfo(name, id));
}
// ID অনুযায়ী সর্ট করা (Comparator)
Collections.sort(list, new Comparator() {
@Override
public int compare(UserInfo o1, UserInfo o2) {
return o1.id.compareTo(o2.id); // স্ট্রিং কম্পারিজন
// সংখ্যা হলে: Integer.parseInt(o1.id) - Integer.parseInt(o2.id)
}
});
// প্রথম আইটেম দেখানো
if (!list.isEmpty()) {
textView.setText("ID: " + list.get(0).id + "\nName: " + list.get(0).name);
}
} catch (JSONException e) {
e.printStackTrace();
textView.setText("JSON পার্সিং ত্রুটি: " + e.getMessage());
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VolleyError", error.toString());
textView.setText("নেটওয়ার্ক ত্রুটি: " + error.getMessage());
}
});
// রিকোয়েস্ট টাইমআউট সেট
request.setRetryPolicy(new com.android.volley.DefaultRetryPolicy(
10000, // ১০ সেকেন্ড টাইমআউট
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(request);
}
// ইনার ক্লাস - ইউজার ইনফো মডেল
private static class UserInfo {
String name, id;
public UserInfo(String name, String id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "UserInfo{name='" + name + "', id='" + id + "'}";
}
}
}
গুরুত্বপূর্ণ ক্লাস ও মেথড ব্যাখ্যা
| ক্লাস/মেথড | ব্যাখ্যা |
|---|---|
| RequestQueue | নেটওয়ার্ক রিকোয়েস্টের কিউ ম্যানেজ করে |
| StringRequest | GET/POST রিকোয়েস্ট স্ট্রিং রেসপন্স হিসেবে পায় |
| Volley.newRequestQueue() | ডিফল্ট কিউ তৈরি করে (ক্যাশ + নেটওয়ার্ক থ্রেড) |
| AbstractList<E> | List ইন্টারফেসের আংশিক ইমপ্লিমেন্টেশন (ArrayList এর প্যারেন্ট) |
| Collections.sort() | লিস্ট সর্ট করার স্ট্যাটিক মেথড |
| Comparator<T> | কাস্টম সর্টিং লজিক ডিফাইন করার ইন্টারফেস |
JSON রেসপন্স স্ট্রাকচার (মক ডেটা)
{
"users": [
{"id": "3", "name": "Charlie"},
{"id": "1", "name": "Alice"},
{"id": "2", "name": "Bob"}
]
}
সর্টিং পাশে: Alice (id:1), Bob (id:2), Charlie (id:3)
আধুনিক উন্নতি: JsonArrayRequest ব্যবহার
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, URL, null,
new Response.Listener() {
@Override
public void onResponse(JSONArray array) {
// সরাসরি JSONArray পাওয়া যায়, JSONObject পার্সিং লাগে না
for (int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
// ...
}
}
}, errorListener);
Kotlin + Coroutines + Volley (আধুনিক পদ্ধতি)
// build.gradle.kts
implementation("com.android.volley:volley:1.2.1")
// Repository ক্লাস
suspend fun fetchUsers(): Result> = suspendCancellableCoroutine { cont ->
val request = JsonArrayRequest(Request.Method.GET, URL, null,
{ response -> cont.resume(Result.success(parseUsers(response))) },
{ error -> cont.resume(Result.failure(error)) })
queue.add(request)
}
অ্যাপ্লিকেশন চালানো
রান করলে নেটওয়ার্ক থেকে JSON ডেটা ফেচ করে, পার্স করে, ID অনুযায়ী সর্ট করে প্রথম ইউজার দেখাবে।
লক্ষ্য করুন
- Volley ডিপ্রিকেটেড নয়, কিন্তু Retrofit + OkHttp + Coroutines/Flow আধুনিক পছন্দ
- AbstractList শুধু ইন্টারফেস - ArrayList বা LinkedList ব্যবহার করুন
- UI থ্রেডে নেটওয়ার্ক কল ন করুন (Volley অটোমেটিক ব্যাকগ্রাউন্ডে করে)
- Error handling এবং রিট্রাই পলিসি সেট করুন
- ProGuard/R8 রুলস Volley-এর জন্য যোগ করুন