ওয়েক লক সর্বোত্তম অনুশীলন অনুসরণ করুন

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

ওয়েক লকটির যথাযথ নামকরণ করুন।

আমরা wakelock ট্যাগে আপনার প্যাকেজ, ক্লাস বা মেথডের নাম অন্তর্ভুক্ত করার পরামর্শ দিই। এর ফলে, কোনো ত্রুটি ঘটলে, আপনার সোর্স কোডে ওয়েক লকটি কোথায় তৈরি হয়েছিল তা খুঁজে বের করা সহজ হয়। এখানে আরও কিছু অতিরিক্ত পরামর্শ দেওয়া হলো:

  • নামে কোনো ব্যক্তিগত শনাক্তকারী তথ্য (PII), যেমন ইমেল ঠিকানা, বাদ দিন। যদি ডিভাইসটি ওয়েক লক ট্যাগে PII শনাক্ত করে, তবে এটি আপনার নির্দিষ্ট করা ট্যাগের পরিবর্তে _UNKNOWN লগ করে।
  • প্রোগ্রাম্যাটিকভাবে ক্লাস বা মেথডের নাম নেবেন না, যেমন getName() কল করে। আপনি যদি প্রোগ্রাম্যাটিকভাবে নামটি পেতে চেষ্টা করেন, তবে Proguard-এর মতো টুল দ্বারা এটি অস্পষ্ট হয়ে যেতে পারে। এর পরিবর্তে একটি হার্ড-কোডেড স্ট্রিং ব্যবহার করুন।
  • ওয়েক লক ট্যাগে কোনো কাউন্টার বা অনন্য শনাক্তকারী যোগ করবেন না। যে কোডটি ওয়েক লক তৈরি করে, সেটি প্রতিবার চলার সময় একই ট্যাগ ব্যবহার করবে। এই পদ্ধতিটি সিস্টেমকে প্রতিটি মেথডের ওয়েক লক ব্যবহারের হিসাব একত্রিত করতে সক্ষম করে।

আপনার অ্যাপটি ফোরগ্রাউন্ডে দৃশ্যমান আছে কিনা তা নিশ্চিত করুন।

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

যদি আপনার অ্যাপের জন্য ফোরগ্রাউন্ড সার্ভিস সঠিক বিকল্প না হয়, তাহলে সম্ভবত আপনার ওয়েক লকও ব্যবহার করা উচিত নয়। আপনার অ্যাপ ফোরগ্রাউন্ডে না থাকা অবস্থায় কাজ করার অন্যান্য উপায় জানতে, ‘ডিভাইসকে জাগিয়ে রাখার জন্য সঠিক এপিআই বেছে নিন’ ডকুমেন্টেশনটি দেখুন।

যুক্তি সহজ রাখুন

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

নিশ্চিত করুন যে ওয়েক লকটি সর্বদা রিলিজ করা আছে।

আপনি যদি ওয়েক লক ব্যবহার করেন, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার অর্জিত প্রতিটি ওয়েক লক সঠিকভাবে রিলিজ করা হয়েছে। এটা শুনতে যতটা সহজ মনে হয়, সবসময় ততটা সহজ নয়। উদাহরণস্বরূপ, নিম্নলিখিত কোডটিতে একটি সমস্যা রয়েছে:

কোটলিন

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        acquire()
        doTheWork() // can potentially throw MyException
        release()   // does not run if an exception is thrown
    }
}

জাভা

void doSomethingAndRelease() throws MyException {
    wakeLock.acquire();
    doTheWork();         // can potentially throw MyException
    wakeLock.release();  // does not run if an exception is thrown
}

এখানে সমস্যাটি হলো, doTheWork() মেথডটি MyException নামক একটি এক্সেপশন থ্রো করতে পারে। যদি এটি তা করে, তাহলে doSomethingAndRelease() মেথডটি এক্সেপশনটিকে বাইরের দিকে ছড়িয়ে দেয় এবং এটি কখনোই release() কল পর্যন্ত পৌঁছায় না। এর ফলে ওয়েক লকটি অ্যাকোয়ার্ড হলেও রিলিজ হয় না, যা খুবই খারাপ একটি বিষয়।

সংশোধিত কোডে, doSomethingAndRelease() নিশ্চিত করে যে কোনো এক্সেপশন থ্রো করা হলেও ওয়েক লকটি রিলিজ করা হয়:

কোটলিন

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        try {
            acquire()
            doTheWork()
        } finally {
            release()
        }
    }
}

জাভা

void doSomethingAndRelease() throws MyException {
    try {
        wakeLock.acquire();
        doTheWork();
    } finally {
        wakeLock.release();
    }
}