java - الفرق بين `initLoader` و` restartLoader` في `LoaderManager`




3 Answers

إن استدعاء initLoader عند إنشاء Loader بالفعل (يحدث هذا عادة بعد تغييرات التكوين ، على سبيل المثال) يخبر LoaderManager بتسليم أحدث بيانات onLoadFinished إلى onLoadFinished الفور. إذا لم يتم إنشاء initLoader بالفعل (عندما يتم تشغيل النشاط / الجزء أولاً ، على سبيل المثال) تخبر المكالمة إلى initLoader LoaderManager للاتصال onCreateLoader لإنشاء أداة تحميل جديدة.

يزيل استدعاء restartLoader أداة تحميل موجودة بالفعل (بالإضافة إلى أي بيانات موجودة مقترنة بها) ويخبر LoaderManager باستدعاء onCreateLoader لإنشاء أداة تحميل جديدة وبدء تحميل جديد.

الوثائق واضحة جدا حول هذا أيضا:

  • يضمن initLoader تهيئة برنامج Loader ونشطًا. إذا لم يكن المحمل موجودًا بالفعل ، فسيتم إنشاء واحد (وفي حالة بدء تشغيل النشاط / الجزء الحالي) ، يبدأ المحمل. بخلاف ذلك ، يتم إعادة استخدام اللودر الذي تم إنشاؤه مؤخرًا.

  • يبدأ restartLoader جديدًا أو restartLoader تشغيل أداة تحميل موجودة في هذا المدير ، ويسجّل طلبات معاودة الاتصال به ، و (إذا بدأ النشاط / الجزء في الوقت الحالي) في تحميله. إذا سبق تشغيل محمل له نفس المعرف ، فسيتم تدميره تلقائيًا عند اكتمال المحمل الجديد عمله. سيتم تسليم الاستدعاء قبل أن يتم إتلاف المحمل القديم.

java android android-loadermanager

أنا فقدت تماما فيما يتعلق الاختلافات بين restartLoader ووظائف restartLoader من LoaderManager :

  • كلاهما لهما نفس التوقيع.
  • ينشئ restartLoader أيضًا محمل ، إذا لم يكن موجودًا ("يبدأ جديدًا أو restartLoader تشغيل أداة تحميل موجودة في هذا المدير").

هل هناك علاقة ما بين الطريقتين؟ هل يتصل استدعاء restartLoader دائمًا بـ initLoader ؟ هل يمكنني استدعاء restartLoader دون الحاجة إلى استدعاء initLoader ؟ هل حفظ استدعاء initLoader مرتين لتحديث البيانات؟ متى ينبغي عليّ استخدام أحد الاثنين و (مهم!) لماذا؟




إذا كان المُحمل موجودًا بالفعل ، فسوف يقوم restartLoader بإيقاف / إلغاء / إتلاف الأداة القديمة ، بينما يقوم initLoader فقط بتهيئته باستخدام معاودة الاتصال. لا أستطيع معرفة ما تفعله الاستدعاءات القديمة في هذه الحالات ، ولكن أعتقد أنه سيتم التخلي عنها فقط.

لقد أجريت فحصًا ضوئيًا عبر http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/app/LoaderManager.java ولكني لم أتمكن من معرفة الفرق ، وبصرف النظر عن أن الأساليب تفعل أشياء مختلفة. لذا أود أن أقول ، استخدم initLoader في المرة الأولى وأعد تشغيله في الأوقات التالية ، على الرغم من أنني لا أستطيع أن أقول بكل تأكيد ما سيفعله كل منهم بالضبط.




initLoader استخدام المعلمات نفسها إذا كان المحمل موجودًا بالفعل. يتم عرضها فورًا إذا كانت البيانات القديمة محملة بالفعل ، حتى إذا قمت بالاتصال بها بمعلمات جديدة. يجب على المحمل أن يقوم تلقائيًا بإخطار نشاط البيانات الجديدة. إذا تم تدوير الشاشة ، سيتم استدعاء initLoader مرة أخرى وسيتم عرض البيانات القديمة على الفور.

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




Related