আপনার অ্যাপের কিছু ব্যবহারকারীর ইন্টারনেট সংযোগ অনিয়মিত থাকে অথবা তাদের ডিভাইসে তথ্য ডাউনলোডের পরিমাণে সীমাবদ্ধতা থাকে। আপনার অ্যাপের ডাউনলোডের জন্য প্রয়োজনীয় ডেটার পরিমাণ কমিয়ে আপনি ব্যবহারকারীদের অ্যাপটি আরও ঘন ঘন ব্যবহারে উৎসাহিত করতে পারেন।
আপনার ডাউনলোড কমানোর সবচেয়ে মৌলিক উপায় হলো শুধু প্রয়োজনীয় ডেটা ডাউনলোড করা। ডেটার ক্ষেত্রে, এর অর্থ হলো এমন REST API প্রয়োগ করা যা আপনাকে কোয়েরির শর্তাবলী নির্দিষ্ট করার সুযোগ দেয়। এই শর্তাবলী আপনার শেষ আপডেটের সময়ের মতো প্যারামিটার ব্যবহার করে ফেরত আসা ডেটাকে সীমিত করে।
একইভাবে, ছবি ডাউনলোড করার সময়, ক্লায়েন্টে আকার কমানো পূর্ণ আকারের ছবি ডাউনলোড করার পরিবর্তে সার্ভার-সাইডে ছবির আকার কমানো একটি ভালো অভ্যাস।
ক্যাশে HTTP প্রতিক্রিয়া
আরেকটি গুরুত্বপূর্ণ কৌশল হলো ডুপ্লিকেট ডেটা ডাউনলোড করা এড়িয়ে চলা। ক্যাশিং ব্যবহার করে আপনি একই ডেটা বারবার ডাউনলোড হওয়ার সম্ভাবনা কমাতে পারেন। আপনার অ্যাপের ডেটা এবং রিসোর্স ক্যাশ করার মাধ্যমে, আপনি সেই তথ্যের একটি স্থানীয় কপি তৈরি করেন যা আপনার অ্যাপের রেফারেন্স হিসেবে প্রয়োজন হয়। যদি আপনার অ্যাপকে অল্প সময়ের মধ্যে একই তথ্য একাধিকবার অ্যাক্সেস করার প্রয়োজন হয়, তবে আপনাকে এটি ক্যাশে শুধুমাত্র একবারই ডাউনলোড করতে হবে।
আপনার ডাউনলোড করা মোট ডেটার পরিমাণ কমাতে যথাসম্ভব কার্যকরভাবে ক্যাশ করা গুরুত্বপূর্ণ। পূর্ণ আকারের ছবির মতো অন-ডিমান্ড ডাউনলোড সহ স্ট্যাটিক রিসোর্সগুলো সর্বদা যুক্তিসঙ্গতভাবে যত দিন সম্ভব ক্যাশ করে রাখুন। অন-ডিমান্ড রিসোর্সগুলো আলাদাভাবে সংরক্ষণ করা উচিত, যাতে আপনি এর আকার পরিচালনা করার জন্য নিয়মিত আপনার অন-ডিমান্ড ক্যাশ ফ্লাশ করতে পারেন।
আপনার ক্যাশিংয়ের কারণে অ্যাপে যেন পুরোনো ডেটা প্রদর্শিত না হয়, তা নিশ্চিত করতে উপযুক্ত HTTP স্ট্যাটাস কোড এবং হেডার , যেমন ETag ও Last-Modified হেডার ব্যবহার করুন। এর মাধ্যমে আপনি নির্ধারণ করতে পারবেন কখন সংশ্লিষ্ট কন্টেন্ট রিফ্রেশ করা উচিত। উদাহরণস্বরূপ:
কোটলিন
// url represents the website containing the content to place into the cache. val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection val currentTime: Long = System.currentTimeMillis() val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime) // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified }
জাভা
// url represents the website containing the content to place into the cache. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); long currentTime = System.currentTimeMillis(); long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime); // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified; }
আপনি কিছু নেটওয়ার্কিং লাইব্রেরিকে এই স্ট্যাটাস কোড এবং হেডারগুলো স্বয়ংক্রিয়ভাবে অনুসরণ করার জন্য কনফিগার করতে পারেন। উদাহরণস্বরূপ, OkHttp ব্যবহার করার সময়, ক্লায়েন্টের জন্য একটি ক্যাশ ডিরেক্টরি এবং ক্যাশ সাইজ কনফিগার করলে লাইব্রেরিটি HTTP ক্যাশিং ব্যবহার করতে সক্ষম হবে, যেমনটি নিম্নলিখিত কোড স্যাম্পলে দেখানো হয়েছে:
কোটলিন
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
জাভা
File cacheDir = Context.getCacheDir(); long cacheSize = 10L * 1024L * 1024L; // 10 MiB OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) .build();
ক্যাশে কনফিগার করা থাকলে, আপনি সরাসরি লোকাল স্টোরেজ থেকে সম্পূর্ণ-ক্যাশযুক্ত HTTP অনুরোধগুলি পরিবেশন করতে পারেন, যার ফলে নেটওয়ার্ক সংযোগ খোলার প্রয়োজন হয় না। শর্তসাপেক্ষে ক্যাশে করা প্রতিক্রিয়াগুলি সার্ভার থেকে তাদের সতেজতা যাচাই করতে পারে, যা ডাউনলোডের সাথে যুক্ত ব্যান্ডউইথের খরচ দূর করে। ক্যাশে না করা প্রতিক্রিয়াগুলি ভবিষ্যতের অনুরোধের জন্য রেসপন্স ক্যাশে সংরক্ষিত থাকে।
আপনি Context.getExternalCacheDir() ব্যবহার করে অসংবেদনশীল ডেটা আনম্যানেজড এক্সটার্নাল ক্যাশ ডিরেক্টরিতে ক্যাশ করতে পারেন। বিকল্পভাবে, আপনি Context.getCacheDir() ব্যবহার করে ম্যানেজড, সুরক্ষিত অ্যাপ্লিকেশন ক্যাশে ডেটা ক্যাশ করতে পারেন। মনে রাখবেন যে, সিস্টেমে উপলব্ধ স্টোরেজ কমে গেলে এই অভ্যন্তরীণ ক্যাশটি ফ্লাশ হয়ে যেতে পারে।
একটি সংগ্রহস্থল ব্যবহার করুন
ক্যাশিং-এর আরও উন্নত পদ্ধতির জন্য, রিপোজিটরি ডিজাইন প্যাটার্নটি বিবেচনা করতে পারেন। এর জন্য রিপোজিটরি নামে একটি কাস্টম ক্লাস তৈরি করতে হয়, যা কোনো নির্দিষ্ট ডেটা বা রিসোর্সের উপর একটি এপিআই অ্যাবস্ট্রাকশন প্রদান করে। রিপোজিটরিটি প্রাথমিকভাবে একটি রিমোট ওয়েব সার্ভিসের মতো বিভিন্ন উৎস থেকে তার ডেটা সংগ্রহ করতে পারে, কিন্তু পরবর্তী কলগুলোতে কলারদের ডেটার একটি ক্যাশ করা সংস্করণ সরবরাহ করে। এই ইনডিরেকশনের স্তরটি আপনাকে আপনার অ্যাপের জন্য নির্দিষ্ট একটি শক্তিশালী ক্যাশিং কৌশল প্রদান করতে সাহায্য করে। আপনার অ্যাপে রিপোজিটরি প্যাটার্ন ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ‘ গাইড টু অ্যাপ আর্কিটেকচার’ দেখুন।