"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تجنب تسرب الموارد عند استخدام مستمعي اللقطات في FirebaseUI-Android RecyclerView؟

كيفية تجنب تسرب الموارد عند استخدام مستمعي اللقطات في FirebaseUI-Android RecyclerView؟

تم النشر بتاريخ 2024-11-04
تصفح:795

 How to Avoid Resource Leaks When Using Snapshot Listeners in FirebaseUI-Android RecyclerView?

إضافة وإزالة مستمعي اللقطات في FirebaseUI-Android RecyclerView

يوفر FirebaseUI-Android طريقة ملائمة لملء RecyclerViews بالبيانات في الوقت الفعلي من فايرستور. ومع ذلك، من المهم فهم كيفية إضافة مستمعي اللقطات وإزالتهم بشكل صحيح لتجنب تسرب الموارد.

إضافة مستمع لقطة

عند استخدام FirebaseRecyclerAdapter، تتم إضافة مستمع لـ كل عنصر في RecyclerView. في الأسلوب populateViewHolder، يمكنك استخدام الأسلوب getRef(i) لاسترداد DocumentReference للعنصر الحالي.

للاستماع إلى التغييرات في المرجع، يمكنك استخدام الأسلوب addSnapshotListener (EventListener). تأخذ هذه الطريقة EventListener كوسيطة، والتي سيتم استدعاؤها كلما تغيرت لقطة المرجع.

إزالة مستمع اللقطة

من الضروري إزالة المستمع عندما لم تعد هناك حاجة إليها. سيؤدي عدم القيام بذلك إلى تسرب الذاكرة. يمكنك إزالة المستمع باستخدام طريقة الإزالة () على كائن تسجيل المستمع.

التنفيذ في طريقة populateViewHolder

فيما يلي مثال لكيفية إضافة لقطة وإزالتها المستمع في طريقة populateViewHolder الخاصة بـ FirebaseRecyclerAdapter:

@Override محمية باطلة populateViewHolder(final ConvViewHolder convViewHolder, Final Conv conv, int i) { السلسلة النهائية list_user_id = getRef(i).getKey(); Final DocumentReference docRef = db.collection("cities").document(list_user_id); ListerRegistration listerRegistration = null; إذا (تسجيل المستمع == فارغ) { المستمعRegistration = docRef.addSnapshotListener(new EventListener() { @تجاوز onEvent باطلة عامة (@Nullable DocumentSnapshot snapshot، @Nullable FirebaseFirestoreException e) { إذا (ه! = فارغة) { Log.w(TAG, "فشل الاستماع.", e); يعود؛ } إذا (لقطة!= فارغة && snapshot.exists()) { Log.d(TAG، "البيانات الحالية:" snapshot.getData()); } آخر { Log.d(TAG، "البيانات الحالية: فارغة"); } } }); }

@Override
protected void populateViewHolder(final ConvViewHolder convViewHolder, final Conv conv, int i) {
    final String list_user_id = getRef(i).getKey();
    final DocumentReference docRef = db.collection("cities").document(list_user_id);
    ListenerRegistration listenerRegistration = null;
    if (listenerRegistration == null) {
        listenerRegistration = docRef.addSnapshotListener(new EventListener() {
            @Override
            public void onEvent(@Nullable DocumentSnapshot snapshot,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w(TAG, "Listen failed.", e);
                    return;
                }
                if (snapshot != null && snapshot.exists()) {
                    Log.d(TAG, "Current data: "   snapshot.getData());
                } else {
                    Log.d(TAG, "Current data: null");
                }
            }
        });
    }
}

إزالة المستمع في أساليب دورة حياة النشاط

لإزالة المستمع عندما لم يعد النشاط مرئيًا، يمكنك تجاوز طريقة onStop() في نشاطك واستدعاء طريقة الإزالة () في سجل المستمع.

@Override الفراغ المحمي onStop () { super.onStop(); إذا (تسجيل المستمع ! = فارغ) { listerRegistration.remove(); }

@Override
protected void onStop() {
    super.onStop();
    if (listenerRegistration != null) {
        listenerRegistration.remove();
    }
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3