Android Webservices

Android Webservices بالعربية – Volley

 

فى الدروس السابقة  كنا نقوم بإجراء الاتصال من جهة الاندرويد باستخدام HttpUrlConnection لاجراء الاتصال بملف الـ php واستخدمنا طريقة الـ POST والGET فى الإرسال وكذلك استقبلنا النتائج وكل شىء من جهة الاندرويد كان يتم باستخدم الـ HttpURLConnection واليوم نحن على وشك أن نقوم باستخدام طريقة اخرى لتنفيذ الاتصال من جهة الاندرويد قل مرحبا لـ Volley

 

ما هى Volley

هى مكتبة تم تطويرها بواسطة جوجل اعلن عنها فى مؤتمر الـ I/O سنة 2013 وذلك لأنه لا يوجد كلاسات متخصصة للاتصال بالانترنت فى الـ Android SDK وكان المبرمجون يعتمدون بشكل اساسى على كلاسات عامة مثل كلاس الاباتشى HttpClient وكلاس الـجافا HttpURLConnection  ومع انه تتم اجراء الاتصالات بنجاح واصدار تطبيقات تعمل بشكل جيد الا ان httpClient اصبحت depracted وتم حذفها فى الاصدار 23 من الـ SDK كذلك الـ HttpUrlConnection مع أنها ممتازة جدا فى اجراء الاتصال الا ان بها بعض المشاكل مع بعض اصدارات أندرويد القديمة كالاصدار 2.0 بالاضافة أنك تحتاج لعمل Thread جديد كما رأينا سابقا وربما ستستخدم الـ AsyncTask كبديل للثريد العادى وتقوم بعمل check للـ Null  Pointer Exeption  واذا اردت ان تقوم بعمل cache فستقوم بمحاولة تنفيذه يدويا  لذلك أتت Volley لتحل العديد من المشاكل وتجعل علمية الاتصال أكثر سهولة وسلاسة حيث توفر لك مجموعة كلاسات جاهزة لاجراء الاتصال كما يمكنك انشاء كلاساتك الخاصة اعتمادا عليها   .

 

مميزات Volley

1- أسرع أكثر بـ 10 مرات من الاتصال العادى بـ HttpURLConnection  طبقا لبعض التجارب  التى قامت بالمقارنه بينهما .

2- امكانية تنظيم تسلسل أو تتابع الاتصالات ففى الطريقة العادية HttpURLConnection ليس لديك القدرة على تنظيم عمليات الاتصال فقط تقوم بالاتصال واذا كان هناك أكثر من اتصال فانه يتم بتنفيذه بترتيب الكود فقط أما فى volley لديك القدرة على التحكم فى الاتصالات بشكل اكبر وجعل اتصال له اهمية اكثر واتصال يتم تنفيذه بشكل اسرع  أو قبل اتصال اخر وغير ذلك .

3- تقوم بعمل cache للاتصالات اوتوماتيكيا  وهذا احد اسباب سرعتها على سبيل المثال فى الدرس الخاص بالـ JSONparsing السابق لو نفذنا الاتصال بـاستخدام volley فإنها تقوم بعمل cache وعند تحميل الصفحة مرة اخرى تقوم volley بالاستجابة للطلب من خلال الـ cache المخزن سابقا بعد التاكد من انه مثل الموجود اون لاين تماما وبالتالى لا حاجه لاعادة تحميل الـ string او الـ json طالما هو مخزن بشكل مؤقت .

4- تقوم بالاعتناء بأمر الـ Threads تلقائيا وتقوم هى بتنفيذ الاتصاالات بالانترنت من خلال الـ Threads الخاصة بها حيث أن لديها ثريد داخلى  للانترنت وثريد داخلى للكاش وبالتالى تريحك من عناء انشاء ثريد او التعامل مع asynctask فهى تقوم باجراء الاتصال وتقوم بارجاع النتيجة لك فى الـ MainThread  مباشرة .

 

volly comic

ومع كل تلك المميزات التى تتمتع بها volley فانها لا يمكن استخدامها فى القيام بالاتصال لعمل Streaming أو تحميل الملفات كبيرة الحجم فهى رائعة للاتصالات الخفيفة مثل طلب Json  أو String أو تحميل ملفات صغيرة الحجم لكن عندما يتعلق الامر بالتعامل مع الملفات الكبيرة الحجم فان volley ليس لها مكان هنا .

كيف تعمل Volley اثناء الاتصال :

تقوم volley بتفقد الـ cache والتأكد هل يمكن خدمة هذا الطلب وارجاع النتائج من الـ cache  اذا كان نعم تقوم  بسحب النتائج من الـ cache واذا لا تقوم volley بالاتصال بالانترنت وسحب النتائج .

2016-02-15_14-13-42

استخدام Volley

اضافة المكتبة للمشروع 

لاستخدام volley فى مشروعك يجب عليك استيراد المكتبة الى Android Studio

ويكفى ان تضيف هذا السطر الى ملف الـ Gradle فى تطبيقك ثم تقوم بعمل

compile 'com.android.volley:volley:1.0.0'

add volley to gradle

وتضغط على الزر الاخضر فى التول بار الخص باندرويد ستوديو   فيبدأ الجرادل بالعمل

compile

والان تم اضافة المكتبة وأنت جاهز لاستخدامها .

اجراء الاتصال بواسطة Volley 

فى الوضع العادى كنا نقوم باجراء الاتصال هكذا باستخدام الـ HttpUrlConnection .

 (الجزء المخفى هو الجزء الخاص بتحويل الـ String الذى كنا نجلبه الى JSON ثم List  وهذا امر اخر ليس له علاقة بالاتصال الان )

http

لنقوم بتنفيذ الاتصال السابق باستخدام Volley توفر لنا Volley عدة كلاساات يمكننا استخدامها

StringRequest لجلب string  من url معينه

 JSONRequest لجلب json  من رابط انترنت معين عن طريق كلاسين فرعيين وهما JSONObjectRequest لجلب كائن جيسون من احد الروابط  و JSONArrayRequst  لجلب مصفوفة جيسون من أحد الروابط

 ايضا الكلاس ImageRequst  ويمكنك أن تخمن ماذا يجلب هذا الكلاس 😉 .

كذلك لدينا الكلاس ImageLoader لكن لا يقوم فقط بجلب الصورة كالـ ImagRequest بل ويقوم بعمل setImage لها مباشرة بشرط أن تستخدم NetworkImageView بدلا من ImageView فى ملف الـ xml .

حسنا الان اريد تنفيذ الكود السابق الذى نفذناه فى درس الـ JSONParsing من قبل ومع أنى اريد JSONObject الا أننى سوف استخدم الـ StringRequest لأجلب ناتج الصفحة الجيسون على هيئة string كما فعلنا فى الاتصال السابق تماما حتى تستطيع المقارنة بين الـ volley والـ httpurlconnection .

سوف أقوم الان ببدء استخدام الكلاس StringRequest   بإنشاء كائن جديد منه كالتالى :

requst

ستجد أن الكلاس لديه constractor يقوم بأخذ عدة parameters كما هى موضحة فى الصورة وهى :

Method  : طريقة الاتصال هل تريد اجراء الاتصال بـ GET أم POST  .

String url  : الرابط او الـ url التى تريد اجراء StringRequest عليه .

Listener<String> string  : مثلما تقوم تماما بعمل onClickListener للزر يمكنك هنا أن تقوم بعمل Listener للـ Request عند اتمام الـ request يقوم بتنفيذ امر ما والـ Listener هنا من النوع String وفى حالة اجراء Request من نوع اخر .

ErrorListener  : هو عباره عن Listener للخطأ فعندما لا يتم الاتصال او تم وحدث أى خطأ فانه لا يتم مناداة الـ Listener  السابق وبالتالى يتم استدعاء هذا الـ Listener معه رسالة الخطأ الذى حدث .

سوف أقوم باعطاء البارامترز وسيكون الكود كالتالى :

string request volley

سوف أقوم بوضع نفس كود الـ JSONParsing من الدرس السابق  بداخل الميثود onResponse السابقة

volley request queue json

وفى السطر الاخير قمت بعمل newRequstQueue لكى اضيف اليه الـ request ليتم تنفيذه حيث يتم تنفيذ الـ requests سواء string لو json او غيرها باستخدام الـ requstQueue  الخاص بالـ volley  .

نقوم الان بتشغيل التطبيق

volar

volleyarabicproblem

لقد اشتغل الكود بشكل ممتاز كاتصال لكن حدثت مشكله هنا وهى اللغة العربية عرضت برموز وأرقام غريبه  وصراحة لقد سعدت بحدوث هذه المشكلة الان  😀 لانها فرصة لك لتتعلم شىء جديد يخص الترميز وحتى تستطيع التصرف ان صادفك مشكلة مثل هذه فى اى وقت .

عندما قامت volley بارسال الطلب واستقبال النتيجة قامت بشكل افتراضى بتكويد النص باستخدام iso-8859-1 وهذا لا يوجد به اى مشكلة بالنسبة للغة الإنجليزية ابدا أما بالنسبة للعربية لا بد من utf-8  لكى تعرض بشكل صحيح لذلك يمكننا حل هذه المشكلة بأكثر من طريقه منها تكويد المتغير النصى الناتج عن الاتصال response  الى صغية اخر ثم استرجاعه لكن استرجاعه باستخدام utf-8 كالتالى :

str

قمنا بعمل string مؤقت لنقوم بتكويد النص القادم فيه باستخدام الكلاس URLEncoder  واعطيناه المتغير response وكذلك الصغية المكود بها حاليا ليتم تخزين ناتج التكويد فى المتغير encodedstring  وقمنا بعدها باستخدام الكلاس URLDecoder واعطيناها المتغير المكود سابقا ولكن الان قمنا بعمل decode  وتخزين النص الجديد المنسق بترميز urf-8 فى response

قم بتشغيل التطبيق الان .

app

والطريقة الاخرى هى تحويل المتغير النصى  response الى bytes ثم استرجاع النص مرة اخرى من الـ bytes  مع ترميزه بالترميز الصحيح وفى الكود التالى مثال على ذلك .

           byte[] u = response.toString().getBytes("ISO-8859-1");
           response = new String(u, "UTF-8");

 

 

إرسال  البيانات مع الـ Request  

يمكنك ارسال الـ Paramters كما حدث فى الاتصال باستخدام HttpURLConnection فى السابق فقط جهز الـ paramters وقم بعمل Encode لهم وادمجهم مع الـ url

اما بطريقة الـ POST  فتتم  كالتالى :

string request

مكان السهم الازرق من المفترض ان هناك semi colen نهاية ال requsert لكن قمنا بحذفها وفتح {} وبداخلهم قمنا بعمل override لـ getParams وهى الميثود المخصصة بارسال البارامترز المخصصة للإرسال   فى الـ volley  .

 

مثلما قمنا بإنشاء الـ StringRequst فى الامثلة السابقة يمكنك تطبيق ما فعلنا على اى كلاس Request اخر سيكون هناك اختلافات طفيفة فى الـ Paramters الخاصة بالكلاس فقط .

 

على سبيل المثال JSONObjectRequst  سوف يعود لنا الناتج بدلا من response كـ String سوف يعود كـ JSONObject

2016-02-15_17-35-59

وتأخذ بارامترز مثل السابق لكن تلاحظ هنا زيادة بارامتر requestbody وهو يتيح لك ارسال شىء ما فى body الـ httprequest  ولا اقصد هنا كلاس اسمه httprequest  لكن عملية الاتصال نفسها واستدعاء الرابط سنقوم بعمل مقال قريبا عن الـ httprequest  والذى ستعرف أنه يتكون من requestline وهو الرابط و header لبعض الخصائص وايضا body  لكن الان يمكنك وضع null فى الـ requestbody  .

 

الى هنا تنتهى التدوينة

الواجب : 

قم بعمل تطبيق يحتوى على ImagView وتحتها زر LoadImage يقوم باستخدام ImageRequest  ليجلب الصورة ويعرضها فى هذا الـ Imageview  سوف تجد بعض الـ paramters الجديدة التى يأخذها الـ Request  وهى واضحة سهله وسوف يساعدك الاندرويد ستوديو باقتراحاته كالعادة قم بالبحث عن هذه البارامترز فى جوجل واذا احتجت مساعدة فقط اترك تعليقا بما وصلت اليه وما ينقصك وما لا تفهمه .

 

اذا اكملت الواجب فسوف تحصل على اجاباات لكل أسئلتك التى تريدها عن الـ Volley فقط اترك لنا تعليقا مرفق به صورة تطبيقك للواجب وسنجيبك بالتفصيل .

 

ملحوظة : فى الاستخدام السابق لـ Volley فى التدوينة قمنا باستخدام Volley.newRequestQueue وأنشأنا RequestQueue جديد وهذا مناسب للاستخدام مرة واحده لكن اذا كنت ستستخدم الـ volley فى كل الـ Activies فى تطبيقك وستجرى الكثير من الاتصالات فيفضل استخدام الـ Volley Singletone Pattern وهو أحد الـ Design Pattern المشهورة والتى تتلخص فى انشاء اوبجكت واحد واستخدامه مرات عديدة بدلا من استخدام اوبجكت فى كل مرة وسيكون هناك تدوينة عنه قريبا .
السابق
Android Webservices بالعربية – JSON Parsing
التالي
ما يجب أن يعرفه كل مبرمج عن الـ Http

24 تعليق

أضف تعليقا

  1. انت برنس يا هندي بالله العظيم مكانك مش هنا
    مبسوط اني صديقك 😀

    1. Hendiware قال:

      شكرا صديقى باسم 😉

  2. Ayoub El hassani قال:

    بارك الله فيك أخي على مجهوداتك الرائعة

    1. Hendiware قال:

      وفيك أيوب نورت المدونة

  3. Mahmoud Emad Eldeen Saad قال:

    دايما للأمام.
    أنا إستفدت منكم كتيير.
    ولو ليا مكان وسطكم أشتغل ببلاش أنا موافق.

    1. Hendiware قال:

      مبسوطين انك بتستفاد يامحمود
      ممكن تتواصل معانا على mail@hendiware.16mb.com

  4. Ahmed Ali قال:

    الف شكر علي الشرح الرائع دا ربنا يجازيك كل خير

    1. Hendiware قال:

      منورنا دايما يا أحمد ^_^

      1. Ahmed Ali قال:

        متابعكو علي طول 😀

  5. Sw My2 قال:

    يعطيك الف عاافيه.. اذكر فيه موقع للمكتبة غير الموجود في موقع الاندرويد ياليت تعطينا اياه،

    1. Hendiware قال:

      لا اعرف مواقع اخرى سوى هذه المكتبة والموقع الرسمى لجوجل لكن تحتاج لعمل compile لـ volley بنفسك اذا استخدمته
      اذا كنت تعرف موقعنا اخر شاركنا به

  6. wejdan قال:

    يعطيك العافية شرح رائع
    بس ممكن تشرح مكتبة Retrofit لو سمحت

    1. Hendiware قال:

      بيتم التجهيز لها ان شاء الله قريبا جدا فى هذه السلسلة

  7. ahmed قال:

    عاش والله انا عارف الحاجات دى بس لما قريت المدونه عرفت معلومات اكتر استمروا

  8. سليم قال:

    مجهودات غاية في الروعة
    بارك الله فيك

  9. Gamal sebaee قال:

    الف شكرا ليك علي الشرح الرائع عندي سؤال حابب اسئله
    انا استخدمت ال libaray دي وسريعه
    بس في وقت اجي استخدمها يخرج مسدج connection time out ولازم احاول مرتين او تلاته علشان يطلع الناتج ممكن حل للمشكله دي

  10. safaa Hussein قال:

    ما هي افضل طريقة لرفع ملفات كبيرة الحجم

  11. Ahmed shaheen قال:

    جزاك الله عنا خير الجزاء

  12. روان شداد قال:

    السلام عليكم
    جزاك الله كل خير
    لو سمحت حابة أسأل الأندرويد استديو عندي جدا بطيء
    وماعم اقدر نزل المكتبة volley

  13. خالد قال:

    جزاك الله كل خير انت دايم تنقذني

  14. ramadan قال:

    شكرا هند

  15. karem ata قال:

    how to use volley cache when the device is offline

اترك تعليقاً

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.