android kotlin - Volley JsonArrayRequest

Android Kotlin - Volley JsonArrayRequest: Summary

This code demonstrates fetching a JSON array from a URL and displaying its content in a scrollable TextView using Volley, a popular Android networking library. The user clicks a button to trigger the request, and the response is parsed to extract student data (first name, last name, and age). This data is then displayed in a formatted way within the TextView.

Android Kotlin - Volley JsonArrayRequest: Breakdown

The code is divided into three parts:

  1. MainActivity.kt: This is the main activity class that handles user interaction and network requests. It defines the layout elements (button, progress bar, and text view) and their functionalities. When the button is clicked, it:

    • Disables the button to prevent multiple clicks.
    • Shows the progress bar to indicate ongoing network activity.
    • Creates a JsonArrayRequest object specifying the URL, method (GET), success and error listeners.
    • Adds the request to Volley's request queue using a singleton instance of VolleySingleton.
  2. VolleySingleton.kt: This class implements a singleton pattern to manage Volley's request queue. It provides a static method getInstance to access the single instance and a method addToRequestQueue to add network requests to the queue. This approach ensures a single instance of the queue exists throughout the application.

  3. activity_main.xml: This file defines the layout of the activity in XML format. It includes a button to trigger the network request, a progress bar to indicate loading, and a text view to display the parsed data.

The code utilizes org.json libraries for parsing the JSON response. It iterates through the JSON array elements, extracts individual student data (names and age), and appends the formatted information to the text view.


MainActivity.kt

package com.cfsuman.kotlintutorials

import android.app.Activity
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.view.View
import android.widget.*
import com.android.volley.Request
import com.android.volley.toolbox.JsonArrayRequest
import org.json.JSONException
import org.json.JSONObject


class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get the widgets reference from XML layout
        val button = findViewById<Button>(R.id.button)
        val progressBar = findViewById<ProgressBar>(R.id.progressBar)
        val textView = findViewById<TextView>(R.id.textView)

        // make text view content scrollable
        textView.movementMethod = ScrollingMovementMethod()

        // url to get json array
        val url = "https://pastebin.com/raw/Em972E5s"


        // get json array from url using volley network library
        button.setOnClickListener {
            // disable the button itself
            it.isEnabled = false

            progressBar.visibility = View.VISIBLE

            // request json array response from the provided url
            val request = JsonArrayRequest(
                Request.Method.GET, // method
                url, // url
                null, // json request
                {response -> // response listener
                    try {
                        textView.text = ""

                        // loop through the array elements
                        for (i in 0 until  response.length()){
                            // get current json object as student instance
                            val student: JSONObject = response.getJSONObject(i)

                            // get the current student (json object) data
                            val firstName: String = student
                                .getString("firstname")
                            val lastName: String = student
                                .getString("lastname")
                            val age: Int = student.getInt("age")

                            // display the formatted json data in text view
                            textView.append("$firstName " +
                                    "$lastName\nAge : $age\n\n")
                        }

                    }catch (e: JSONException){
                        textView.text = e.message
                    }

                    progressBar.visibility = View.INVISIBLE
                },
                {error -> // error listener
                    textView.text = error.message
                    progressBar.visibility = View.INVISIBLE
                }
            )

            // add network request to volley queue
            VolleySingleton.getInstance(applicationContext)
                .addToRequestQueue(request)
        }
    }
}
VolleySingleton.kt

package com.cfsuman.kotlintutorials

import android.content.Context
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.Volley

class VolleySingleton constructor(context: Context) {
    companion object {
        @Volatile
        private var INSTANCE: VolleySingleton? = null
        fun getInstance(context: Context) =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: VolleySingleton(context).also {
                    INSTANCE = it
                }
            }
    }
    private val requestQueue: RequestQueue by lazy {
        // applicationContext is key, it keeps you from leaking the
        // Activity or BroadcastReceiver if someone passes one in.
        Volley.newRequestQueue(context.applicationContext)
    }
    fun <T> addToRequestQueue(req: Request<T>) {
        requestQueue.add(req)
    }
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#DCDCDC"
    android:padding="24dp">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Run Volley"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/button"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="@+id/button" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="16dp"
        android:fontFamily="sans-serif"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button"
        tools:text="TextView" />

</androidx.constraintlayout.widget.ConstraintLayout>
gradle dependencies

// Volley network library
implementation 'com.android.volley:volley:1.2.1'
More android kotlin tutorials