القائمة الرئيسية

الصفحات

ماهي مكتبة volley library android وكيفية إستخدامها في برمجة تطبيقات الاندرويد

السلام عليكم .. سنتعلم اليوم درس جديد في سلسلة دروس برمجة تطبيقات الاندرويد وسيكون الدرس حول التعامل مع مكتبة فولي للاندرويد  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>
ويستخدم هذا الكلاس عندما تكون الاستجابة من الطلب على صيغة JSONArray  وهذا يعني أن الاستجابة ستبدأ ب " ] ".

سنقوم بشرح بعض الداول الاكثر استخداما في مكتبة volley :
 
public static RequestQueue newRequestQueue(Context context);
 وهي عبارة عن static method  في الكلاس Volley  وتستخدم لإنشاءوتهيئة  RequestQueue  ليتم  إضافة الطلبات Requests اليها.
نوع الارجاع :- RequestQueue.

public Request add(Request request);


. RequestQueue إلى    Request وتستخدم لإضافة الطلب RequestQueue  وهي دالة موجودة بالكلاس
الباريميتر Request : وهو الطلب Request  المرار اضافته إلى Request Queue.

نوع الارجاع :  Request  .

public void setTag(String tag);
وهي دالة موجودة بالكلاس Request  وتستخدم لوضع Tag  أو وسم لاي طلب Request ونستخدم ذلك الوسم للحصول على ذلك الطلب بقول اخر هذه الدالة مثلها مثل وضع الاسم للاشخاص فمثلا عندما يكون هناك شخص اسمه محمد فإننا سننادي  عليه بإسمه محمد .. ومثلها للطلبات Request  فمثلا هنا طلب وضعنا الـ Tag  الخاص به مثلا "Tag_A" فإننا نستطيع الحصول على ذلك الطلب بواسطة الـ Tag  الخاص به.. أرجو أن تكون وضحت الفكرة .

الباريميتر tag : وهو متغير نصي  وهو الوسم Tag  المراد وضعه للطلب Request.
نوع الارجاع :  void  .

public void cancelAll(Object tag)
وهي دالة موجودة بالكلاس RequestQueue  وتستخدم لحذف جميع الطلبات Requests  من RequestQueue  بواسطة الوسم Tag الذي تم اسناده لتلك الطلبات Requests .

الباريميتر Object : وهو الوسم الذي سيتم من خلاله الطلبات حذف الطلبات Requests.
نوع الارجاع :  void  .


4-مثال على استخدام مكتبة volley

سنقوم بشرح أمثلة حول كيفية استخدام مكتبة Volley  في  أي مشروع اندرويد ونذلك سنقوم بالخطوات التالية:-

1.4:- نفتح بيئة اندرويد استديو ونقوم بإنشاء مشروع اندرويد جديد نسميه VolleyExample.
رابط قد يفيدك كيفة إنشاءوتشغيل أول تطبيق اندرويد في اندرويد ستديو Android Studio

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 :- 
وهي عبارة عن Callback interface تستخدم لاستلام الاستجابة من الرابط ونقوم بعمل اوفرايد للدالة onRespone  ويتم استدعتء هذه الدالة عند استلام البيانات من السيرفر بنجاح.

5-Response.ErrorListener :-
وهي عبارة عن Callback interface تستخدم عندما لايتم استلام الاستجابة من السيرفر وحصول اخطاء .
السطر20 :-

اضافة الـ JsonObjectRequest  الذي قمنا بإنشائه إلى RequestQueue  . 



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.