آموزش Volley به زبان کاتلین در اندروید

سلام دوستان همیشگی در این سری از آموزش برنامه نویسی اندروید به آموزش Volley به زبان کاتلین در اندروید می پردازیم استفاده از کتابخانه volley در kotlin بسیار ساده است ! البته ما این کلاس را کمی سفارشی کردیم تا با حدودا 20 خط کد بتوانید عمل درخواست های سمت api خود را با استفاده از این کتابخانه فوق العاده انجام دهید در ادامه با ما همراه باشید.
 
اگر خیلی عجله دارید بخش اول را نیاز نیست بخونید ?
بخش اول : حوصله سربر
شاید برای افرادی که تازه این کتابخانه را پیدا می کنند یک کتاب خانه فوق العاده و جادویی به نظر برسه ولی هرچی که پیش میرید در پروژه های سنگین تر می بینید کتابخانه volley چقدر ناقص است و بدرد هرکاری نمی خورد از این بخش که بگذریم به بخش method های کثیف volley میرسیم به نظرم کلاس volley با خط کمتر بهتر بود برای همین یک مقدار ساده ترش کردم در ادامه یک کلاس براتون قرار میدم که تمامی کارهای volley را برای شما در خط های کمتری انجام خواهد داد 🙂
بخش دوم : کد
حتما قبل از استفاده از کدهای زیر کتابخانه volley را در گریدل اضافه کنید.

implementation 'com.android.volley:volley:1.1.0'

اگر یادتون باشه در جاوا همانند زیر درخواست volley انجام داده می شد.

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
    url, null,
    new Response.Listener < JSONObject > () {
        @Override
        public void onResponse(JSONObject response) {
            handleResponse(response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            showError(error.getMessage());
        }
    }) {
    @Override
    protected Map < String, String > getParams() {
        Map < String, String > params = new HashMap < String, String > ();
        params.put("email", "wolf@winterfell.com");
        params.put("password", "wint3r1sc0m1ng");
        return params;
    }
};
MyApplication.getInstance().addToRequestQueue(jsonObjReq);

از این بخش که بگذریم می بینم که در اینچا حدودا 20 خط فقط به منظور یه درخواست ساده هدر رفته است.
کدی که من خودم درست کردم همانند زیر است.

HashMap <String, String> params = new HashMap <> ();
params.put("email", "wolf@winterfell.com");
params.put("password", "wint3r1sc0m1ng");
new WolfRequest(url, new WolfListener() {
    @Override
    public void response(JSONObject response) {
        handleResponse(response);
    }
    @Override
    public void error(String error) {
        showError(error);
    }
}).POST(params);

به همین راحتی درخواست سمت سرور انجام می شود.
در واقع با ایجاد یک کلاس کد مربوط به درخواست  volley را محدود کردم و با پاس دادن parms ها و داشتن callback عمل ساده سازی انجام شده است.
کلاسی که باید به پروژه اد کنید در زیر می توانید ببینید

class WolfRequest(val url: String,
                  val result: (JSONObject) -> Unit,
                  val error: (String) -> Unit) {
    fun POST(vararg params: Pair<String, Any>) {
        // HashMap to pass arguments to Volley
        val hashMap = HashMap<String, String>()
        params.forEach {
            // Convert all Any type to String and add to HashMap
            hashMap[it.first] = it.second.toString()
        }
        // Make the Http Request
        makeRequest(Request.Method.POST, hashMap)
    }
    private fun makeRequest(method: Int, params: HashMap<String, String>) {
        // Creating a StringRequest
        val req = object : StringRequest(method, url, { res ->
            // Creating JSON object from the response string
            // and passing it to result: (JSONObject) -> Unit function
            result(JSONObject(res.toString().trim()))
        }, { volleyError ->
            // Getting error message and passing it
            // to val error: (String) -> Unit function
            error(volleyError.message)
        }) {
            // Overriding getParams() to pass our parameters
            override fun getParams(): MutableMap<String, String> {
                return params
            }
        }
        // Adding request to the queue
        volley.add(req)
    }
    // For using Volley RequestQueue as a singleton
    // call WolfRequest.init(applicationContext) in
    // app's Application class
    companion object {
        var context: Context? = null
        val volley: RequestQueue by lazy {
            Volley.newRequestQueue(context
                    ?: throw NullPointerException(" Initialize WolfRequest in application class"))
        }
        fun init(context: Context) {
            this.context = context
        }
    }
}

نحوه استفاده از آن هم بسیار ساده است.
تنها نکته ای که می ماند قبل از اینکه عمل درخواست زدن را شروع کنید حتما باید کلاس را initialize کنید مثل زیر

class MyAwesomeApp : Application() {
    override fun onCreate() {
        super.onCreate()
        WolfRequest.init(this)
    }
}

خب شاید برخی از دوستان دوست نداشته باشن از این کلاس استفاده کنند در نتیجه در ادامه یکسری مثال از Volley به زبان کاتلین در اندروید قرار میدهیم
نکته اول دسترسی اینترنت

<uses-permission android:name=”android.permission.INTERNET”/>

در لینک زیر یک json ساده ایجاد شده است تا آن را پارس کنیم

https://api.github.com/search/users?q=eyehunt

و فرض می کنیم activity_main.xml هم همانند زیر شامل یک TextView است.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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"
    tools:context="in.eyehunt.volleyandroidsimplerequest.MainActivity">
    <TextView
        android:textColor="@color/colorPrimary"
        android:textAllCaps="true"
        android:id="@+id/tv_users"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Hello World!"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.051"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.032" />
</android.support.constraint.ConstraintLayout>

و کد مربوط به MainActivity.kt نیز به شکل زیر تعریف شده است.

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONArray
import org.json.JSONObject
class MainActivity : AppCompatActivity() {
    private var textView: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById<TextView>(R.id.tv_users)
        getUsers()
    }
    // function for network call
    fun getUsers() {
        // Instantiate the RequestQueue.
        val queue = Volley.newRequestQueue(this)
        val url: String = "https://api.github.com/search/users?q=eyehunt"
        // Request a string response from the provided URL.
        val stringReq = StringRequest(Request.Method.GET, url,
                Response.Listener<String> { response ->
                    var strResp = response.toString()
                    val jsonObj: JSONObject = JSONObject(strResp)
                    val jsonArray: JSONArray = jsonObj.getJSONArray("items")
                    var str_user: String = ""
                    for (i in 0 until jsonArray.length()) {
                        var jsonInner: JSONObject = jsonArray.getJSONObject(i)
                        str_user = str_user + "\n" + jsonInner.get("login")
                    }
                    textView!!.text = "response : $str_user "
                },
                Response.ErrorListener { textView!!.text = "That didn't work!" })
        queue.add(stringReq)
    }
}

کدهای بالا برای خواندن Json یا همان Method گت (GET) کاربرد دارد دوستانی که می خواهند عمل Post را انجام دهند از کد زیر استفاده کنند.

fun sendcall() {
            //RequestQueue initialized
            mRequestQueue = Volley.newRequestQueue(this)
           //String Request initialized
            mStringRequest = object : StringRequest(Request.Method.POST, url, Response.Listener { response ->
                Toast.makeText(applicationContext, "Logged In Successfully", Toast.LENGTH_SHORT).show()
            }, Response.ErrorListener { error ->
                Log.i("This is the error", "Error :" + error.toString())
                Toast.makeText(applicationContext, "Please make sure you enter correct password and username", Toast.LENGTH_SHORT).show()
            }) {
                override fun getBodyContentType(): String {
                    return "application/json"
                }
                @Throws(AuthFailureError::class)
                override fun getBody(): ByteArray {
                    val params2 = HashMap<String, String>()
                    params2.put("Login","your credentials" )
                    params2.put("Password", "your credentials")
                    return JSONObject(params2).toString().toByteArray()
                }
            }
            mRequestQueue!!.add(mStringRequest!!)
        }

 
موفق و پیروز باشید.

مطالعه بیشتر