বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

ইনএক্স্যাক্ট রিপিটিং এ্যালার্ম এবং এক্সপোনেন্ট ব্যাকঅফ দিয়ে পোলিং অপটিমাইজ করা

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

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

যখন আপডেট শিডিউল করা হয়, ইনএক্স্যাক্ট রিপিটিং এ্যালার্ম ব্যবহার করুন যা সিস্টেমকে প্রতিটা এ্যলার্ম ট্রিগ্রারের সময় ”ফেজ শিফট” ("phase shift") করতে দেয়।

int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;

alarmManager.setInexactRepeating(alarmType, start, interval, pi);

যদি কতিপয় এ্যালার্ম একই সময়ে ট্রিগ্রার করার জন্য শিডিউল করা হয়ে থাকে, এই ফেজ শিডিউল একই সাথে ট্রিগার হতে দিতে পারে, প্রতিটা আপডেটকে একটি একক সক্রিয় রেডিও স্টেট পরিবর্তনের উপর piggyback করতে দেয়।

যেখানেই সম্ভব, সমগোত্রীয় _WAKEUP এ না করে ELAPSED_REALTIME বা RTC এ আপনার এ্যালার্ম টাইপ সেট করুন। এটা অপেক্ষা করার মাধ্যমে ব্যাটারি প্রভাব অধিক হারে কমিয়ে আনে, ফোনটি এ্যালার্ম ট্রিগার হওয়ার পূর্ব পর্যন্তত যতক্ষন না স্ট্যান্ডবাই মোডে না থাকে।

আপনি আপনার অ্যাপ কত সম্প্রতি ব্যবহার করেছেন তার উপর ভিত্তি করে তাদের ফ্রিকোয়েন্সি কমিয়ে দেয়ার মাধ্যমে এই শিডিউল করা এ্যালার্মগুলোর প্রভাব কমিয়ে আনতে পারেন।

একটি উপায় হচ্ছে আপনার আপডেটের ফ্রিকোয়েন্সি (এবং/বা প্রিফেচিং এর ডিগ্রি আপনি সম্পাদন করেন) কমাতে একটি এক্সপোনেনশিয়াল ব্যাক-অফ ধরন বাস্তবায়ন করা, যদি অ্যাপটি পূর্ববর্তী আপডেট থেকে ব্যবহৃত হয়ে না আসে। এটা কখনও কখনও একটি কমপক্ষে আপডেট ফ্রিকোয়েন্সি জানাতে এবং যখনই অ্যাপ ব্যবহৃত হয় তখন ফ্রিকোযেন্সি পূণরায় সেট করতে উপকারী। উদাহরণস্বরূপ:

SharedPreferences sp =
  context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE);

boolean appUsed = sp.getBoolean(PREFS_APPUSED, false);
long updateInterval = sp.getLong(PREFS_INTERVAL, DEFAULT_REFRESH_INTERVAL);

if (!appUsed)
  if ((updateInterval *= 2) > MAX_REFRESH_INTERVAL)
    updateInterval = MAX_REFRESH_INTERVAL;

Editor spEdit = sp.edit();
spEdit.putBoolean(PREFS_APPUSED, false);
spEdit.putLong(PREFS_INTERVAL, updateInterval);
spEdit.apply();

rescheduleUpdates(updateInterval);
executeUpdateOrPrefetch();

আপনি ব্যর্থ কানেকশন এবং ডাউনলোড এররের প্রভাব কমিয়ে আনতে একই ধরনের এক্সপোনেনশিয়াল ব্যাক-অফ ধরন ব্যবহার করতে পারেন।

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

private void retryIn(long interval) {
  boolean success = attemptTransfer();

  if (!success) {
    retryIn(interval*2 < MAX_RETRY_INTERVAL ?
            interval*2 : MAX_RETRY_INTERVAL);
  }
}

বিকল্পভাবে, ব্যর্থতা সহিঞœ টান্সফারের জন্য (যেমন, নিয়মিত আপডেট), আপনি শুধু অসফল কানেকশন এবং ট্রান্সফার চেষ্টা এড়িয়ে যেতে পারেন।