البرمجة التفاعلية في Kotlin: مكتبة RxKotlin و coroutines

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة التفاعلية في Kotlin: من RxKotlin إلى coroutines

البرمجة التفاعلية هي نموذج يركز على المعالجة غير المتزامنة لتدفقات البيانات ونشر التغييرات. في نظام Kotlin البيئي، يتم تنفيذ هذا المفهوم بطريقتين رئيسيتين: من خلال مكتبة RxKotlin (الإضافات التفاعلية لـ Kotlin المستندة إلى RxJava) ومن خلال آلية coroutines المدمجة مع Flow. في هذه المقالة، سنشرح بالتفصيل كلا النهجين، وخصائصهما وأمثلة استخدامهما.



ما هي البرمجة التفاعلية؟

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



مكتبة RxKotlin

RxKotlin هي غلاف فوق RxJava يضيف إضافات ملائمة لـ Kotlin، مثل تعبيرات لامدا، ودوال الإضافة، ودعم أمان القيم الخالية. الأنواع الرئيسية:

  • Observable<T> - تدفق يمكنه إصدار من 0 إلى N من العناصر والانتهاء بخطأ أو بنجاح.
  • Single<T> - تدفق يصدر عنصرًا واحدًا بالضبط أو خطأ.
  • Flowable<T> - تدفق مع دعم الضغط العكسي (التحكم في سرعة الاستهلاك).
  • Completable - تدفق ينتهي فقط (نجاح/خطأ) بدون بيانات.


مثال RxKotlin

import io.reactivex.rxjava3.core.Observableimport io.reactivex.rxjava3.schedulers.Schedulers

fun main() { val observable = Observable.create<String> { emitter -> emitter.onNext("مرحبًا") emitter.onNext("من") emitter.onNext("RxKotlin") emitter.onComplete() }

observable .subscribeOn(Schedulers.io()) .observeOn(Schedulers.single()) .subscribe( { value -> println("تم الاستلام: $value") }, { error -> println("خطأ: ${error.message}") }, { println("تم إنهاء التدفق") } )

Thread.sleep(1000) // انتظار اكتمال العمليات غير المتزامنة}

في هذا المثال، يتم إنشاء Observable يصدر ثلاث سلاسل نصية وينتهي. تدير العوامل subscribeOn و observeOn تدفقات التنفيذ.



Coroutines و Flow في Kotlin

بدءًا من Kotlin 1.3، أصبحت coroutines جزءًا من اللغة، و Flow (التي تم تقديمها في 1.3.70) هي تدفق تفاعلي مدمج بالكامل مع coroutines. المزايا مقارنة بـ RxKotlin:

  • تكاليف عامة أقل (coroutines خفيفة الوزن مقابل خيوط Java).
  • تكامل طبيعي مع دوال التعليق (suspend functions).
  • دعم التزامن المنظم (الإلغاء التلقائي عند إنهاء النطاق).
  • بناء جملة أنظف بدون استدعاءات رد.


مثال Flow

import kotlinx.coroutines.*import kotlinx.coroutines.flow.*

fun main() = runBlocking { val flow = flow { for (i in 1..5) { delay(100) // محاكاة عمل غير متزامن emit(i) // إصدار عنصر } }

flow .map { it * it } // تحويل .catch { e -> println("خطأ: $e") } .collect { value -> println("المربع: $value") }}

Flow كسول: تبدأ البيانات في التوليد فقط عند استدعاء collect. تعمل العوامل map و filter و flatMapConcat بنفس الطريقة كما في Rx.



مقارنة بين RxKotlin و Flow

توصيات

الخاصية RxKotlin Flow + coroutines
التبعيات