آموزش Volley به زبان کاتلین در اندروید
سلام دوستان همیشگی در این سری از آموزش برنامه نویسی اندروید به آموزش Volley به زبان کاتلین در اندروید می پردازیم استفاده از کتابخانه volley در kotlin بسیار ساده است ! البته ما این کلاس را کمی سفارشی کردیم تا با حدودا 20 خط کد بتوانید عمل درخواست های سمت api خود را با استفاده از این کتابخانه فوق العاده انجام دهید در ادامه با ما همراه باشید.
اگر خیلی عجله دارید بخش اول را نیاز نیست بخونید ?
بخش اول : حوصله سربر
شاید برای افرادی که تازه این کتابخانه را پیدا می کنند یک کتاب خانه فوق العاده و جادویی به نظر برسه ولی هرچی که پیش میرید در پروژه های سنگین تر می بینید کتابخانه volley چقدر ناقص است و بدرد هرکاری نمی خورد از این بخش که بگذریم به بخش method های کثیف volley میرسیم به نظرم کلاس volley با خط کمتر بهتر بود برای همین یک مقدار ساده ترش کردم در ادامه یک کلاس براتون قرار میدم که تمامی کارهای volley را برای شما در خط های کمتری انجام خواهد داد 🙂
بخش دوم : کد
حتما قبل از استفاده از کدهای زیر کتابخانه volley را در گریدل اضافه کنید.
1 | implementation 'com.android.volley:volley:1.1.0' |
اگر یادتون باشه در جاوا همانند زیر درخواست volley انجام داده می شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 خط فقط به منظور یه درخواست ساده هدر رفته است.
کدی که من خودم درست کردم همانند زیر است.
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 عمل ساده سازی انجام شده است.
کلاسی که باید به پروژه اد کنید در زیر می توانید ببینید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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 کنید مثل زیر
1 2 3 4 5 6 | class MyAwesomeApp : Application() { override fun onCreate() { super.onCreate() WolfRequest.init(this) } } |
خب شاید برخی از دوستان دوست نداشته باشن از این کلاس استفاده کنند در نتیجه در ادامه یکسری مثال از Volley به زبان کاتلین در اندروید قرار میدهیم
نکته اول دسترسی اینترنت
1 | <uses-permission android:name=”android.permission.INTERNET”/> |
در لینک زیر یک json ساده ایجاد شده است تا آن را پارس کنیم
https://api.github.com/search/users?q=eyehunt
و فرض می کنیم activity_main.xml هم همانند زیر شامل یک TextView است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?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> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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) } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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!!) } |
موفق و پیروز باشید.