البرمجة

تحسين أداء Retrofit 2.0 في تنفيذ عدة طلبات في Android

فيما يتعلق بتحسين رمزك والتعامل مع العديد من الطلبات في Retrofit 2.0 على Android، يُفضل استخدام مكتبة Retrofit بشكل أكثر فعالية لإدارة هذا السيناريو. يمكن تحقيق ذلك باستخدام Call الذي يعود من كل طلب.

أولاً وقبل أن نبدأ في التعامل مع العديد من الطلبات، يمكنك تحسين الكود الحالي ببعض التغييرات. يمكنك استخدام List لتخزين الطلبات ومن ثم استخدام execute() بدلاً من enqueue() لضمان استجابة الطلبات بشكل متزامن. وفيما يلي كود محسن:

java
Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASEURL) .addConverterFactory(GsonConverterFactory.create()) .build(); APIService service = retrofit.create(APIService.class); List> calls = new ArrayList<>(); // قم بإعداد قائمة الطلبات بناءً على الاحتياجات الخاصة بك for (int i = 0; i < numberOfCalls; ++i) { Call call = service.getNewsData(); calls.add(call); } List newsList = new ArrayList<>(); try { // قم بتنفيذ الطلبات بشكل متزامن وانتظر الاستجابات for (Call call : calls) { Response response = call.execute(); if (response.isSuccessful()) { ResponseWrap finalRes = response.body(); for (int i = 0; i < finalRes.getResponse().getResults().size(); ++i) { String title = finalRes.getResponse().getResults().get(i).getWebTitle(); News n = new News(titleCategory, title, null); newsList.add(n); } } else { // يمكنك التعامل مع الأخطاء هنا حسب احتياجاتك Toast.makeText(getApplicationContext(), "onResponse - something wrong" + response.message(), Toast.LENGTH_LONG).show(); } } } catch (IOException e) { // التعامل مع الأخطاء المتعلقة بالتنفيذ e.printStackTrace(); Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show(); } // بعد اكتمال الطلبات، قم بتحديث واجهة المستخدم AdapterRecommendation adapter = new AdapterRecommendation(getApplicationContext(), newsList); listView.setAdapter(adapter);

يُفضل أن تكون حذرًا عند استخدام execute() لتجنب تجميد واجهة المستخدم. إذا كانت هناك احتمالات للتأخير، يمكنك النظر في استخدام enqueue() بشكل متقدم باستخدام CountDownLatch أو مكتبة مثل RxJava للتعامل بشكل أفضل مع البرمجة الغير متزامنة.

المزيد من المعلومات

بالطبع، دعونا نوسع قليلاً على الموضوع. في الكود السابق، تم استخدام execute() لتنفيذ الطلبات بشكل متزامن، وهذا يعني أن البرنامج سينتظر حتى يتم استرجاع البيانات من الطلب الأول قبل أن يبدأ في تنفيذ الطلب الثاني وهكذا. هذا يمكن أن يتسبب في تجميد واجهة المستخدم في حالة تواجد عدد كبير من الطلبات أو في حالة اتصال ضعيف.

للتغلب على هذا التحدي، يمكنك استخدام مفهوم متقدم للبرمجة الغير متزامنة باستخدام enqueue() واستخدام CountDownLatch. تمثل CountDownLatch آلية للانتظار حتى تنتهي مجموعة معينة من العمليات. فيما يلي كيف يمكن تحديث الكود باستخدام CountDownLatch:

java
Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASEURL) .addConverterFactory(GsonConverterFactory.create()) .build(); APIService service = retrofit.create(APIService.class); List> calls = new ArrayList<>(); CountDownLatch latch = new CountDownLatch(numberOfCalls); List newsList = new ArrayList<>(); // قم بإعداد قائمة الطلبات بناءً على الاحتياجات الخاصة بك for (int i = 0; i < numberOfCalls; ++i) { Call call = service.getNewsData(); calls.add(call); // استخدم enqueue() بدلاً من execute() للتعامل مع البرمجة الغير متزامنة call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { ResponseWrap finalRes = response.body(); for (int i = 0; i < finalRes.getResponse().getResults().size(); ++i) { String title = finalRes.getResponse().getResults().get(i).getWebTitle(); News n = new News(titleCategory, title, null); newsList.add(n); } } else { // يمكنك التعامل مع الأخطاء هنا حسب احتياجاتك Toast.makeText(getApplicationContext(), "onResponse - something wrong" + response.message(), Toast.LENGTH_LONG).show(); } latch.countDown(); // قم بتنقيص العداد عند الانتهاء من الطلب } @Override public void onFailure(Call call, Throwable t) { // التعامل مع الأخطاء المتعلقة بالاتصال t.printStackTrace(); Toast.makeText(getApplicationContext(), "Exception: " + t.getMessage(), Toast.LENGTH_LONG).show(); latch.countDown(); // قم بتنقيص العداد في حالة الفشل أيضًا } }); } try { latch.await(); // انتظر حتى يصبح العداد صفرًا } catch (InterruptedException e) { e.printStackTrace(); } // بعد اكتمال الطلبات، قم بتحديث واجهة المستخدم AdapterRecommendation adapter = new AdapterRecommendation(getApplicationContext(), newsList); listView.setAdapter(adapter);

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر