android - গ্লাইড লাইব্রেরিতে ক্যাশে থেকে চিত্র সরান




caching android-glide (10)

আমি ফাইল থেকে চিত্র দেখানোর জন্য আমার একটি প্রকল্পে গ্লাইড ব্যবহার করছি।

নীচে আমার কোডটি কীভাবে আমি চিত্রটি দেখিয়ে দিচ্ছি:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .into(mImage);

এই অবস্থানের চিত্রটি ( imagePath ) পরিবর্তন করে imagePath । ডিফল্টরূপে গ্লাইডকে চিত্রটি ক্যাশে করে এটি চিত্র ImageView দেখায়। এ কারণে, গ্লাইডটি সেই স্থানে নতুন চিত্রের জন্য ক্যাশে থেকে প্রথম চিত্রটি দেখিয়েছিল।

যদি আমি একই imagePath অন্য কোনও চিত্রের সাথে লোকেশন imagePath চিত্রটি পরিবর্তন করি তবে গ্লাইড নতুন চিত্রের পরিবর্তে প্রথম চিত্রটি দেখায়।

দুটি প্রশ্ন হ'ল:

  1. ফাইল থেকে চিত্র সবসময় পাওয়া সম্ভব এবং ক্যাশে নয়? এইভাবে সমস্যার সমাধান হবে।

  2. নতুন প্রতিস্থাপন করা চিত্র পাওয়ার আগে কি ক্যাশে থেকে চিত্র সাফ করা সম্ভব? এটিও সমস্যার সমাধান করবে।


আপনি যদি কনভেনশন হিসাবে একই পরিচিত ফাইলনামে চিত্রগুলি সংরক্ষণ করেন এবং ফাইলটি পরিবর্তিত হয় কেবল তখনই গ্লাইড ক্যাশে অবৈধ করতে চান, ফাইল পরিবর্তনের টাইমস্ট্যাম্প ব্যবহার করে ভাল কাজ করতে পারে।

আমি অবতার চিত্রগুলির জন্য এমন কনভেনশন ব্যবহার করছিলাম যা আমি গ্লাইডের বাইরে File বস্তুগুলিতে ডাউনলোড করছিলাম এবং তারপরে কেবল দক্ষতার সাথে পুনরায় আকার দেওয়ার জন্য এবং তাদের বৃত্তাকার তৈরি করতে গ্লাইড ব্যবহার করছিলাম etc.

সুতরাং আমি স্বাক্ষর হিসাবে ফাইলটির সর্বশেষ চেঞ্জড টাইমস্ট্যাম্পের মান সহ StringSignature কৌশল ব্যবহার করে শেষ করেছি। এটির জন্য সাবলীল কোডটি দেখতে দেখতে এখানে কি:

Glide.with(this)
        .load(avatarFile)
        .diskCacheStrategy(DiskCacheStrategy.RESULT)
        .signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
        .into(ivProfile);
}

যেখানে avatarFile আমার java.io.File অবজেক্ট অবশ্যই।


আমি একটি File লোড করতে গ্লাইড ব্যবহার করছিলাম এবং প্রতিবার আমার ফাইল পরিবর্তন হওয়ার পরে গ্লাইডের ডিস্ক ক্যাশেটি অবৈধ হয়ে গেছে তা নিশ্চিত করার জন্য আমি এখানে কী শেষ করেছি: এটির একই পথ থাকলেও:

 Glide.with(context) .load(bitmapFile) .signature(new ObjectKey(bitmapFile.lastModified())) .into(imageView); 

এইভাবেই আমি এই সমস্যার সমাধান করেছি।

পদ্ধতি 1: যখনই চিত্র পরিবর্তন হয় তখন ইউআরএল পরিবর্তন হয়

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);

ডিস্ক ক্যাশেস্ট্রেট্যাগি () ডিস্ক ক্যাশে হ্যান্ডেল করতে ব্যবহার করা যেতে পারে এবং আপনি স্কিপমেমোরিসিচি () পদ্ধতি ব্যবহার করে মেমরি ক্যাশেটি এড়িয়ে যেতে পারেন।

পদ্ধতি 2: যখন ইউআরএল পরিবর্তন হয় না তবে চিত্র পরিবর্তন হয়

যদি আপনার URL টি স্থির থাকে তবে আপনাকে চিত্রের ক্যাশে স্বাক্ষর ব্যবহার করতে হবে।

Glide.with(yourFragment)
     .load(yourFileDataModel)
     .signature(new StringSignature(yourVersionMetadata))
     .into(yourImageView);

গ্লাইড স্বাক্ষর () আপনাকে ক্যাশে কী এর সাথে অতিরিক্ত ডেটা মেশানোর সক্ষমতা সরবরাহ করে।

  • আপনি যদি মিডিয়া স্টোর থেকে সামগ্রী আনতে থাকেন তবে আপনি MediaStoreSignature ব্যবহার করতে পারেন। MediaStoreSignature আপনাকে ক্যাশে কীতে কোনও মিডিয়া স্টোর আইটেমের তারিখের সংশোধিত সময়, মাইম টাইপ, ওরিয়েন্টেশনকে মিশ্রিত করতে দেয়। এই তিনটি বৈশিষ্ট্য নির্ভরযোগ্যভাবে সম্পাদনাগুলি এবং আপডেটগুলি আপনাকে মিডিয়া স্টোর থাম্বস ক্যাশে করার অনুমতি দেয় catch
  • আপনি ফাইলের তারিখ পরিবর্তিত সময়ের সাথে মিশ্রিত করতে ফাইল হিসাবে সংরক্ষণ করা সামগ্রী হিসাবে StringSignature করতে পারেন।

এটি গ্লাইড দ্বারা সঞ্চিত ক্যাশে মেমরি সরিয়ে ফেলবে nd এবং এটি পটভূমিতে করা উচিত অন্যথায় এটি ব্যতিক্রম ছুঁড়ে ফেলবে

new Thread(new Runnable() {
          @Override
          public void run() {
             Glide.get(MainActivity.this).clearDiskCache();
          }
     }).start();

গ্লাইড অ্যাপের সাথে স্বাক্ষর

    GlideApp.with(imageView)
            .load(url)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .placeholder(R.drawable.sky)
            .error(R.drawable.sky)
            .into(imageView);

গ্লাইড উইকির ক্যাচিং এবং ক্যাশে অবৈধকরণ বিভাগে ব্যাখ্যা করা হয়েছে:

ফাইলের নামগুলি হ্যাশ কীগুলি হওয়ায় ডিস্কের সমস্ত ক্যাশেড ফাইলগুলি কোনও নির্দিষ্ট url বা ফাইল পাথের সাথে সাদৃশ্য মুছে ফেলার কোনও ভাল উপায় নেই। সমস্যাটি সহজ হবে যদি আপনাকে কেবলমাত্র মূল চিত্রটি লোড বা ক্যাশে করার অনুমতি দেওয়া হয়েছিল, তবে যেহেতু গ্লাইড থাম্বনেইলগুলিও ক্যাশে করে এবং বিভিন্ন রূপান্তর সরবরাহ করে, যার প্রতিটিটি ক্যাশে একটি নতুন ফাইল তৈরি করবে, প্রতিটি ক্যাশেড সংস্করণটিকে ট্র্যাক করবে এবং মুছে ফেলবে each একটি ইমেজ কঠিন।

অনুশীলনে, ক্যাশে ফাইলটি অবৈধ করার সর্বোত্তম উপায় হ'ল বিষয়বস্তু পরিবর্তন হওয়ার সাথে সাথে আপনার> শনাক্তকারীকে পরিবর্তন করা (url, uri, ফাইল পাথ ইত্যাদি)।

যেহেতু আপনি ফাইলের পথ পরিবর্তন করতে পারবেন না, তাই গ্লাইড signature() এপিআই সরবরাহ করে যা আপনাকে কিছু অতিরিক্ত ডেটা মেমরি এবং ডিস্ক ক্যাশে কীগুলিতে মিশ্রিত করার অনুমতি দেয় যাতে ক্যাশেড ডেটা বাতিল হয়ে গেলে কলারকে আরও নিয়ন্ত্রণ করতে দেয়।

আপনি যদি ডিস্ক থেকে প্রতিবারের চিত্রটি পুনরায় লোড করতে চান তবে আপনি নিজের কোডটি এভাবে পরিবর্তন করতে পারেন:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(mImage);

গ্লাইড সরবরাহ করা ক্যাশে থেকে উপকার পেতে এবং প্রতিবার সঠিক চিত্রটি প্রদর্শিত হচ্ছে তা নিশ্চিত করতে, আপনি স্বাক্ষর () API ব্যবহার করতে পারেন।

আপনাকে যা করতে হবে তা হ'ল ইমেজ ফাইলের সাথে সম্পর্কিত এমন একটি তথ্য স্বাক্ষর হিসাবে সেট করা। আপনি যখন এই ফাইলটি প্রতিস্থাপন করবেন, তথ্যটি খুব বদলে যায় এবং গ্লাইড জানে এটি ক্যাশে উপেক্ষা করে অবশ্যই এটি পুনরায় লোড করতে হবে।

একটি বৈধ তথ্য হ'ল ডাইজেস্ট (উদাহরণস্বরূপ SHA-1) ফাইলের সামগ্রীতে গণনা করা যেতে পারে।

Glide.with(context)
   .load(inputFile)
   .signature(new StringSignature(sha1(inputFile)))
   .into(targetImageView);

Here আমি sha1 () ফাংশনটির নিম্নোক্ত প্রয়োগটি পেয়েছি:

public static String sha1(final File file) throws NoSuchAlgorithmException, IOException {
   final MessageDigest messageDigest = MessageDigest.getInstance("SHA1");

   try (InputStream is = new BufferedInputStream(new FileInputStream(file)) {
     final byte[] buffer = new byte[1024];
     for (int read = 0; (read = is.read(buffer)) != -1;) {
       messageDigest.update(buffer, 0, read);
     }
   }

   // Convert the byte to hex format
   try (Formatter formatter = new Formatter()) {
     for (final byte b : messageDigest.digest()) {
       formatter.format("%02x", b);
     }
     return formatter.toString();
   }
}

গ্লাইড ৪.২.০ নিয়ে StringSignature ছিল, StringSignature সমাধান হয়নি।

দেখে মনে হচ্ছে StringSignature আর উপলভ্য নয় এবং এর পরিবর্তে আপনাকে ObjectKey ব্যবহার ObjectKey হবে।

কোড দেখতে তাই মনে হচ্ছে

Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);

সর্বশেষতম সংস্করণগুলিতে আমাদের অনুরোধ অপশনগুলি ব্যবহার করা উচিত

রিকোয়েস্টপশনগুলি গ্লাইডের সর্বশেষ সংস্করণগুলিতে গ্লাইডের সাথে লোডগুলি কাস্টমাইজ করতে স্বতন্ত্র বিকল্পগুলি সরবরাহ করে।

একটি অনুরোধ অপশন অবজেক্ট করুন এবং যখন আমরা চিত্রটি লোড করছি তখন এটি ব্যবহার করুন।

 RequestOptions requestOptions = new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
                        .skipMemoryCache(true);

 Glide.with(this)
           .load(photoUrl)
           .apply(requestOptions)
           .into(profile_image);

এটি আমার পক্ষে কাজ করেছে

  //use  diskCacheStrategy(DiskCacheStrategy.NONE) after skipMemoryCache(true) 
         Glide.with(this)
            .load(image)
            .skipMemoryCache(true) 
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(imageview);






android-glide