Picasso: لا يتم تحميل بعض الصور المخزنة مؤقتًا بلا اتصال بالإنترنت

تم إنشاؤها على ٢١ سبتمبر ٢٠١٥  ·  6تعليقات  ·  مصدر: square/picasso

أهلا بك!

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

 Picasso.with(context).load(xxx.getUrl()).fit().centerCrop().networkPolicy(NetworkPolicy.OFFLINE).into(holder.imgFrameBackground, new Callback()
     {

         <strong i="9">@Override</strong>
         public void onSuccess()
         {

         }

         <strong i="10">@Override</strong>
         public void onError()
         {
             Picasso.with(context).load(xxx.getUrl()).fit().centerCrop().into(holder.imgFrameBackground);
         }
     });

يتم تشغيل رد الاتصال onError للصور التي لم يتم تحميلها.
مع النهج أعلاه ، سيتم تحميل الصور - لكن لدي مشاكل مع الصورة الأولى والوحيدة من عرض الشبكة. لقد رأيت بالفعل مشكلات أخرى مماثلة في Stackoverflow حيث لا يتم تحميل الصور المخزنة مؤقتًا المحلية بدون علامة OFFLINE.

كما رأيت أن الصورة الأولى للظهور تظهر عدة مرات داخل سجل بيكاسو. تم استدعاء خط بيكاسو مرة واحدة فقط بالتأكيد.

التعليق الأكثر فائدة

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

ال 6 كومينتر

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

من المحتمل أن تكون هذه الصورة مخزنة مؤقتًا بشكل مشروط مما يتطلب طلب HTTP إلى الخادم البعيد الذي يقوم بإرجاع 304 مما يسمح لنا باستخدام نسخة القرص المخزنة مؤقتًا. بدون اتصال بالإنترنت ، لا يمكن التحقق من حداثة الصورة المخزنة محليًا مؤقتًا وبالتالي يقوم عميل HTTP الأساسي بإرجاع خطأ.

كما رأيت أن الصورة الأولى للظهور تظهر عدة مرات داخل سجل بيكاسو.

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

شكرًا لك ، لماذا تعمل مع NetworkPolicy OFFLINE إذن؟

لأنه يطلب الصورة محليًا من ذاكرة التخزين المؤقت ، حتى لو كان HTTP
يعرف العميل أنه قديم.

يوم الإثنين 21 سبتمبر 2015 الساعة 9:50 مساءً Patric Corletto [email protected]
كتب:

شكرًا لك ، لماذا تعمل مع NetworkPolicy OFFLINE إذن؟

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/square/picasso/issues/1145#issuecomment -142157392.

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

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

نجح هذا المنطق بالنسبة لي:

if network is available:
    Picasso.with(context).load(image).into(imageView);
else:
    Picasso.with(context).networkPolicy(NetworkPolicy.OFFLINE).load(image).into(imageView);
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات