السلام عليكم .. سنتعلم اليوم درس جديد في سلسلة دروس برمجة تطبيقات الاندرويد وسيكون الدرس حول التعامل مع مكتبة فولي للاندرويد volley library android وعن كيفية اضافتها واستخدامها في أي مشروع وتمنح لنا مكتبة فولي للاندرويد volley library android أتصال سريع بالانترنت وذلك عندما تقوم ببرمجة تطبيق يقوم بتبادل بيانات سيرفر والكلاينت فإنك بحاجة إلى استخدام هذه المكتبة volley library android .
كثير مانقوم بانشاء تطبيقات تعتمد على الاتصال بالانترنت وقراءة بيانات من الانترنت فلذلك قامت قوقل بتوفير مكتبة برمجية لمطوري ومبرمجين الاندرويد تسهل الاتصال بالانترنت وباقل اسطر من الاكواد وهي مكتبة فولي volley library android.
1-الطلب والاستجابة والفرق بينهما Request vs Response
أي عملية اتصال انترنت في اي تطبيق سواء كان تطبيق هاتف محمول أو تطبيق كمبيوتر فغنها لابد ان تمر بمرحلتي الطلب والاستجابة لكن ماهو الطلب Requset وماهي الاستجابة Response ستعرف الان وسنقوم بتوضيحهما كمايلي:
1-الطلب Request : وهي عبارة عن عملية التي يقوم بها المستخدم عندما يريد الحصول على بيانات من الانترنت كمثال:
عندما تذهب الى المتصفح وتكت www.google.com فإن ذلك يسمى طلبا.
2- Response الاستجابة: وهي عندما نحصل على البيانات كمثال عندما كتبنا في المتصفح www,google.com فإن ذلك طلبا وعندمما تظهر صفحة قوقل على متصفحك يسمى ذلك استجابة .
دعنى اوضحة لك الفكرة: كلنا نقوم نستخدم تطبيق تويتر فعندما تفتح برنامج تويتر وتقوم بالسحب للتحديث فإن تلك العملية تسمى طلبا Request وعندما تظهر اخر التغريدات في شاشة تطبيق تويتر فإن تلك العملية تسمى استجابة Response.
2-ماهي مكتبة volley library android ؟
هي عبارة عن مكتبة برمجية تم اطلاقها في سنة 2013 خصيصا لنظام اندرويد تجعل من عملية اتصال اي تطبيق اندرويد بالانترنت اكثر سرعة وسهولة وباقل عدد ممكن من الاسطر البرمجية كما تكون تعمل اتصالات هذه المكتبة بشكل متزامن وهذا مايعني اننا لسنا بحاجة إلى استخدام AsyncTask .توجد لهذه المكتبة الكثير من المميزات وستذكر بعضا منها وهي كمايلي:-
1-ترتيب الطلب queuing Requests وتنظيمها حسب الاولوية prioritization.
2-أدارة جيدة للذاكرة memory management .
3- امكانية تطوير المكتبة وتخصيصها على حسب الحاجة.
4- امكانية الغاء الطلبات Cancelling the requests في حالة مااحتجت ذلك.
3-أهم الكلاسات الموجودة في مكتبة volley library android
سنتعرض الان اهم الكلاسات والداول والاكثر استخداما في في مكتبة volley library android وهي كمايي:
public class RequestQueue extends Object
ويستخدم هذا الكلاس لاضافة جميع الطلبات Requests. باستخدام الدالة add أي بمعنى RequestQueue هو المكان الذي سيتم اضافة الطلبات إليه.
public abstract class Request<T> extends Object implements Comparable<Request<T>>
وهو عبار عن الكلاس الأب super class لجميع انواع الطلبات Requests وتوجد كلاسات classes مشتقة من هذا الكلاس وهي كمايلي:-
StringRequest,JsonRequest,ImageRequest,ClearCacheRequest.
public class StringRequest extends Request<String>
وهو كلاس يستخدم لقراءة واستخراج أي نوع من البيانات النصية مثل json, xml, html or plain text فإذا كانت الاستجابة فعندما تكون الاستجابة احد تلك انواع البيانات النصية فبإمكان StringRequest إستقبالها وقرائتها.
public class JsonObjectRequest extends JsonRequest<JSONObject>
ويستخدم هذا الكلاس عندما تكون الاستجابة من الطلب على صيغة JSONObject وهذا يعني أن الاستجابة ستبدأ ب " } ".
public class JsonArrayRequest extends JsonRequest<JSONArray>
سنقوم بشرح بعض الداول الاكثر استخداما في مكتبة volley :
public static RequestQueue newRequestQueue(Context context);
نوع الارجاع :- RequestQueue.
public Request add(Request request);
. RequestQueue إلى Request وتستخدم لإضافة الطلب RequestQueue وهي دالة موجودة بالكلاس
نوع الارجاع : Request .
public void setTag(String tag);
الباريميتر tag : وهو متغير نصي وهو الوسم Tag المراد وضعه للطلب Request.
نوع الارجاع : void .
public void cancelAll(Object tag)
الباريميتر Object : وهو الوسم الذي سيتم من خلاله الطلبات حذف الطلبات Requests.
نوع الارجاع : void .
4-مثال على استخدام مكتبة volley
سنقوم بشرح أمثلة حول كيفية استخدام مكتبة Volley في أي مشروع اندرويد ونذلك سنقوم بالخطوات التالية:-4-مثال على استخدام مكتبة volley
1.4:- نفتح بيئة اندرويد استديو ونقوم بإنشاء مشروع اندرويد جديد نسميه VolleyExample.
رابط قد يفيدك
2.4 :-نفتح ملف build.gradle ثم نذهب إلى dependencies ونضيف الـ dependency الخاص بمكتبة Volley كمافي الكود ادناه:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.volley:volley:1.0.0' }
3.4 :- تهيئة الـ RequestQueue
بماإننا نستخدم مكتبة Volley يفضل أن تكون Queue واحدة يتم وضع فيها كل الطلبات Requests لذلك سيتم تعريفها مرة واحدة فقط على مستوى التطبيق بالكامل وفي هذا الحالة سنقوم بإستخدام نمط Singleton Design Pattern وهو نمط يسمح لك بإنشاء الاوبجكت مرة واحدة فقط وسنقوم باستخدامه لتهيئة الـ RequestQueue وسنقوم بإنشاء كمافي الكود ادناه:-
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 | public class MySingleton { public static final String TAG ="mutee" private static MySingleton mInstance; private RequestQueue mRequestQueue; private static Context mCtx; private MySingleton(Context context) { mCtx = context; mRequestQueue = getRequestQueue(); } public static synchronized MySingleton getInstance(Context context) { if (mInstance == null) { mInstance = new MySingleton(context); } return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { // getApplicationContext() is key, it keeps you from leaking the // Activity or BroadcastReceiver if someone passes one in. mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req) { getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req, String tag) { // set the default tag if tag is empty req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } } |
نلاحظ في الكلاس اعلاه اننا قمنا بإنشاء اربع داول Methods مهمة وهي مايلي كمايلي:-
public RequestQueue getRequestQueue()
ونستدعي هذه الدالة للحصول على اوبجكت من الكلاس RequestQueue ليتم اضافة الطلبات Requests إليها.
1 2 | public <T> void addToRequestQueue(Request<T> req, String tag) public <T> void addToRequestQueue(Request<T> req) |
ونستدعي احد الدالتين عندما نريد إضافة طلب RequestQueue إلى RequestQueue.
public void cancelPendingRequests(Object tag)
ونستدعي هذه الدالة الدالة عندما نريد حذف جميع الطلبات Requests من RequestQueue.
4.4 :- نذهب إلى ملف manifes.xml ونضيف صلاحية بالاتصال بالانترنت كمايلي:-
<uses-permission android:name="android.permission.INTERNET" />
قد يهمك ايضا شرح ماهو ملف AndroidManifest.xml في مشروع الاندرويد؟بالتفصيل
4.5 :- استخدام StringRequest
ذكرنا في الاعلى أن الكلاس StringRequest يستخدم لاستخراج البيانات التي صيغة نصية مثل Json ,xml الخ ..
والان سنتعرف على كيفية استخدام الكلاس عبر المثال الاتي:-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | String url ="http://www.example.com"; // Formulate the request and handle the response. StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("mutee",response); // Do something with the response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Handle error } }); // Add a request (in this example, called stringRequest) to your RequestQueue. MySingleton.getInstance(this).addToRequestQueue(stringRequest); |
السطر 1 :- متغير نصي يحتوي على الرابط الذي سنقوم بقراءة البيانات منه.
السطر 4-17 :- إنشاء كائن من الكلاس Stringrequest واستدعاء دالة المشيد Constructor والتي تستقبل اربعة بارميترات :
1- int methode :-
وهو نوع طريقة الطلب وتم اسناد القيمة Request.Method.GET .
2- String url :-
وهو الرابط الذي نريد قراءة البيانات منه.
3- <Response.Listener<String :-
وهي عبارة عن Callback interface تستخدم لاستلام الاستجابة من الرابط وتحتوي هذا الانترفيس على دالة method واحدة فقط وهي public void onResponse نقوم بعمل اوفرايد لهذه الدالة ويتم استدعائها عندما يتم الحصول على response من السيرفر.
أي إننا سنقوم في هذه الدالة بوضع الكود الذي سنتعامل مع البيانات التي حصلت عليها من السيرفر ثم بعد ذلك سنقوم بعرض تلك البيانات للمستخدم .
4-Response.ErrorListener :-
وهي عبارة عن Callback interface تستخدم عندما لايتم استلام الاستجابة من السيرفر وحصول اخطاء وتحتوي هذا الانترفيس على دالة method واحدة فقط وهي public void onErrorResponse ويتم استدعائها عندما لايتم الحصول على response استجابة من السيرفر.
أي بمعنى إنك ستضع في هذا الدالة كود تخبر المستخدم بإنه لم يتم الحصول على البيانات مثلا عرض مربع حوار أو رسالة.
السطر20 :-
اضافة الـ StrringRequest الذي قمنا بإنشائه إلى RequestQueue . ويجب إن لاننسى هذه الخطوة غير ذلك لن يعمل هذا الكود.
4.6 :- استخدام JSONObjectRequest
الكلاس RequestJSONObject يستخدم لاستخراج البيانات التي صيغة JsonObject اي أن الأستجابة سوف تبدأ بـ "}" .
والان سنتعرف على كيفية استخدام الكلاس عبر المثال الاتي:-
والان سنتعرف على كيفية استخدام الكلاس عبر المثال الاتي:-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | String url ="http://www.example.com"; // Formulate the request and handle the response. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url, null,new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("mutee",response); // Do something with the response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Handle error } }); // Add a request (in this example, called JsonObjectRequest) to your RequestQueue. MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest); |
سنقوم الان بشرح الكود اعلاه حيث انه لايوجد أختلاف كبير بين JsonObjectRequest و StringRequest:-
السطر 1 :- متغير نصي يحتوي على الرابط الذي سنقوم بقراءة البيانات منه.
السطر 3-17 :- إنشاء كائن من الكلاس JsonObjectRequest واستدعاء دالة المشيد Constructor والتي تستقبل اربعة بارميترات :
1- int methode :-
وهو نوع طريقة الطلب وتم اسناد القيمة Request.Method.GET .
2- String url :-
وهو الرابط الذي نريد قراءة البيانات منه.
3-JsonObject :-
هنا نقوم بتمرير اوبجكت من نوع JsonObject وذلك عندمانريد إرسال بيانات للسيرفر ولذلك ستكون نوع طريقة الطلب في البارميتر POST ,, لكننا هنا قمنا بتمرير القيمة Null لإننا لانريد إرسال بيانات للسيرفر .
4- <Response.Listener<String :-
هنا نقوم بتمرير اوبجكت من نوع JsonObject وذلك عندمانريد إرسال بيانات للسيرفر ولذلك ستكون نوع طريقة الطلب في البارميتر POST ,, لكننا هنا قمنا بتمرير القيمة Null لإننا لانريد إرسال بيانات للسيرفر .
4- <Response.Listener<String :-
وهي عبارة عن Callback interface تستخدم لاستلام الاستجابة من الرابط ونقوم بعمل اوفرايد للدالة onRespone ويتم استدعتء هذه الدالة عند استلام البيانات من السيرفر بنجاح.
5-Response.ErrorListener :-
وهي عبارة عن Callback interface تستخدم عندما لايتم استلام الاستجابة من السيرفر وحصول اخطاء .
السطر20 :-
اضافة الـ JsonObjectRequest الذي قمنا بإنشائه إلى RequestQueue .
4.7 :- استخدام JSONِِArrayRequest
الكلاس RequestJSONObject يستخدم لاستخراج البيانات التي صيغة JsonObject اي أن الأستجابة سوف تبدأ بـ
"]" .
4.7 :- استخدام JSONِِArrayRequest
الكلاس RequestJSONObject يستخدم لاستخراج البيانات التي صيغة JsonObject اي أن الأستجابة سوف تبدأ بـ
"]" .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | String url ="http://www.example.com"; // Formulate the request and handle the response. JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d("mutee",response); // Do something with the response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Handle error } }); // Add a request (in this example, called JsonArrayRequest) to your RequestQueue. MySingleton.getInstance(this).addToRequestQueue(jsonArrayRequest); |
سنقوم الان بشرح الكود اعلاه حيث انه لايوجد أختلاف كبير بين JsonObjectRequest و JsonArrayRequest:-
السطر 1 :- متغير نصي يحتوي على الرابط الذي سنقوم بقراءة البيانات منه.
السطر 3-17 :- إنشاء كائن من الكلاس JsonArrayRequest واستدعاء دالة المشيد Constructor والتي تستقبل اربعة بارميترات :
1- int methode :-
وهو نوع طريقة الطلب وتم اسناد القيمة Request.Method.GET .
2- String url :-
وهو الرابط الذي نريد قراءة البيانات منه.
3- <Response.Listener<String :-
وهي عبارة عن Callback interface تستخدم لاستلام الاستجابة من الرابط ونقوم بعمل اوفرايد للدالة onRespone ويتم استدعتاء هذه الدالة عند استلام البيانات من السيرفر بنجاح.
4-Response.ErrorListener :-
وهي عبارة عن Callback interface تستخدم عندما لايتم استلام الاستجابة من السيرفر وحصول اخطاء .
السطر20 :-
اضافة الـ JsonِArraytRequest الذي قمنا بإنشائه إلى RequestQueue .
وهكذا نكون وصلنا إلى نهاية الدرس .. رأيكم يهمني بالتعليقات ...
الدرس القادم سيكون عن كيفية تحميل الصور بواسطة مكتبة volley.
وهكذا نكون وصلنا إلى نهاية الدرس .. رأيكم يهمني بالتعليقات ...
الدرس القادم سيكون عن كيفية تحميل الصور بواسطة مكتبة volley.