سؤال

أقوم بتحميل صورة من القرص باستخدام بيكاسو, ، على سبيل المثال., Picasso.with(ctx).load(new File("/path/to/image")).into(imageView), ، ولكن كلما حفظ صورة جديدة في هذا الملف ، وتحديث بلدي ImageView, ، لا يزال لدى بيكاسو الصورة النقطية المخزنة مؤقتا.

هل من الممكن إبطال ذاكرة التخزين المؤقت في بيكاسو?

هل كانت مفيدة؟

المحلول

في الإصدارات الأخيرة من Picasso، هناك طريقة جديدة للإبطال، دون أي حلول، لذلك أعتقد أن فئة PicassoTools المخصصة المذكورة سابقا، أصبح الآن قديم في هذه الحالة

giveacodicetagpre.

نصائح أخرى

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

giveacodicetagpre.

لأن ذاكرة التخزين المؤقت لها رؤية الحزمة، يمكن أن مسح فئة UTIL هذه التخزين المؤقت لك.عليك فقط الاتصال به:

giveacodicetagpre.

إحباط ذاكرة التخزين المؤقت لذاكرة التخزين المؤقت للذاكرة وفحص ذاكرة التخزين المؤقت للقرص من خلال الإشارة إلى سياسة الذاكرة عن طريق العلم: EmoryPolicy.no_cache و NetworkPolicy.no_cache على النحو التالي Snippet:

giveacodicetagpre.

حاول استخدام:

giveacodicetagpre.

خيار آخر هو حذف دليل ذاكرة التخزين المؤقت نفسه، على سبيل المثال على بدء تشغيل التطبيق:

giveacodicetagpre.

أين:

giveacodicetagpre.

يحذف دليل ذاكرة التخزين المؤقت بأكمله، وهو أمر جيد إذا كنت ترغب في محاكاة الاستخدام الأول لتطبيقك.إذا كنت ترغب فقط في حذف ذاكرة التخزين المؤقت ب Picasso، فقم بإضافة "ذاكرة التخزين المؤقت بيكاسو" إلى المسار.

ما يمكنك فعله إذا كنت تريد حذف كل ذاكرة التخزين المؤقت مرة واحدة ، هو إنشاء مخصص Picasso.LruCache, ، ثم استخدم ملف clear طريقة على ذلك.

هنا عينة:

Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());

لمسح ذاكرة التخزين المؤقت:

picassoCache.clear();

ترتيب البحث في صورة بيكاسو هو:الذاكرة ذاكرة التخزين المؤقت -- > قرص ذاكرة التخزين المؤقت -- > الشبكة

لذلك هناك عدد قليل من السيناريو نحن بحاجة إلى إبطال ذاكرة التخزين المؤقت في بيكاسو:

1.يبطل ذاكرة التخزين المؤقت:

  • Usercase:عندما الصورة بالفعل التحديث في التخزين المؤقت على القرص أو المضيف البعيد
  • الحل:ذاكرة التخزين المؤقت واضحة من عنوان Url أو ملف Uri إذا موجودة

    mPicasso.with(appContext).invalidate(File);
    mPicasso.with(appContext).invalidate(Url);
    mPicasso.with(appContext).invalidate(Uri);
    

.

2.يبطل ذاكرة التخزين المؤقت ذاكرة التخزين المؤقت القرص على الانترنت

※ملاحظة: على الانترنت يعني التحديث مباشرة إلى ImageView

  • حالة المستخدم:صورة محدثة على المضيف البعيد

  • الحل:إحباط صورة على ذاكرة التخزين المؤقت ذاكرة التخزين المؤقت القرص ثم طلب صورة على المضيف البعيد

    mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE )
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);
    

    -> إحباط ذاكرة التخزين المؤقت ذاكرة التخزين المؤقت القرص

.

3.يبطل ذاكرة التخزين المؤقت ذاكرة التخزين المؤقت القرص حاليا

※ ملاحظة: حاليا يعني التحديث ليس تحديث ImageView فقط خلفية جلب إلى استخدام في وقت لاحق

  • حالة المستخدم:تعرف الصورة على المضيف البعيد تحديث, ولكن فقط تريد تحديث ذاكرة التخزين المؤقت فقط إلى استخدام بعد ذلك (لا تحديث في عرض الصورة)
  • الحل:جلب فقط

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .fetch();
    

※ملاحظة:استخدام الجلب() هو جيد لكنه أيضا تستهلك موارد شبكة الاتصال, لذا يرجى النظر بعناية تحقق السيناريو 4 في أدناه للحصول على أفضل حل

4.يبطل ذاكرة التخزين المؤقت ذاكرة التخزين المؤقت القرص حاليا إذا كان التخزين المؤقت على القرص موجودة

  • حالة المستخدم:فقط يبطل ذاكرة التخزين المؤقت إذا كان موجود بالفعل في ذاكرة التخزين المؤقت القرص
  • الحل:يجب فحص القرص باستخدام المعلمة:NetworkPolicy.ذاكرة التخزين المؤقت حاليا قبل جلب

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.OFFLINE)
        .fetch(new Callback() {
            @Override
            public void onSuccess() {
                //Success: mean disk cache exist -> should do actual fetch
                picasso.load(url).fetch();
            }
    
            @Override
            public void onError() {
            //Failed: mean disk cache not exist
        }
    });
    

بيكاسو هو مدهش يبس أتمنى squareup سوف تضيف المزيد من الراحة API لإدارة ذاكرة التخزين المؤقت القادمة في المستقبل.

يمكنك مسح ذاكرة التخزين المؤقت للصور من بيكاسو عن طريق تعيين ذاكرة التخزين المؤقت الخاصة بك وواضح ذلك. تم اختبار هذا الرمز على بيكاسو 2.5.0

giveacodicetagpre.

لا حلقة جميلة، ولكن هذا النهج إصلاح مشكلتي مع ذاكرة التخزين المؤقت و Picasso.استخدم هذا فقط عندما تريد إبطال ذاكرة التخزين المؤقت لعنوان URL محدد، فإن هذا النهج بطيء وربما ليس الطريقة الصحيحة للقيام بذلك ولكنني يعمل بالنسبة لي.

giveacodicetagpre.

جزء مهم جدا مفقود من الإجابة المقبولة هنا.لقد وجدت الحيلة من هنا: http://blogs.candoerz.com/question/124660/android-image-cache-is-not-clearing-in-picasso.aspx

مجرد استدعاء السطر التالي ، لن مسح ذاكرة التخزين المؤقت للصورة عند استخدام خيارات مخصصة مثل تغيير الحجم ، مركز المحاصيل الخ عند عرض الصورة الأصلية.

Picasso.with(getContext()).invalidate(file);

الحل:

عند عرض الصورة ، استخدم stableKey() الطريقة.

Picasso.with(getContext()).load(new File(fileUri))
                         .skipMemoryCache()
                         .placeholder(R.drawable.placeholder)
                         .stableKey(fileUri)
                         .into(imageview);

بعد ذلك ، يمكنك مسح ذاكرة التخزين المؤقت لهذا الملف لاحقا عن طريق استدعاء هذا:

Picasso.with(getContext()).invalidate(fileUri);

نأمل أن يساعد هذا.

You can skip memory cache by skipMemoryCache()

see the following

        Picasso.with(this)
            .load(IMAGE_URL)
            .skipMemoryCache()
            .placeholder(R.drawable.placeholder)
            .error(R.drawable.no_image)
            .into(mImageViewPicasso);

gradle compile "com.squareup.picasso:picasso:2.4.0"

Another option is to save the new image into a different file than the original. Since the Picasso bitmap cache is keyed off of the file path, loading the new image from a different file will result in a cache miss. This also has the side benefit of not having to clear the entire cache.

use shutdown() instead As per source code; shutdown will stop accepting further request as well as clear all cache

 /** Stops this instance from accepting further requests. */
  public void shutdown() {
    if (this == singleton) {
      throw new UnsupportedOperationException("Default singleton instance cannot be shutdown.");
    }
    if (shutdown) {
      return;
    }
    cache.clear();
    cleanupThread.shutdown();
    stats.shutdown();
    dispatcher.shutdown();
    for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) {
      deferredRequestCreator.cancel();
    }
    targetToDeferredRequestCreator.clear();
    shutdown = true;
  }

Also you can not shutdown singleton instance. So you need to have instance variable for Picasso. Do not forget to reinitialize picasso instance everytime you shutdown() it in order to reuse it

File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top