আপনার অ্যাপ্লিকেশন প্রতিক্রিয়াশীল রাখুন

চিত্র 1. ব্যবহারকারীর কাছে প্রদর্শিত একটি ANR ডায়ালগ।

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

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

ANR ট্রিগার

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

উদাহরণস্বরূপ, একটি ANR ঘটতে পারে যদি কোনো অ্যাপ UI থ্রেডে নেটওয়ার্ক অ্যাক্সেসের মতো ব্লকিং I/O অপারেশন করে। আরেকটি উদাহরণ হল যখন একটি অ্যাপ একটি বিস্তৃত ইন-মেমরি কাঠামো তৈরি করতে বা UI থ্রেডে একটি গেমের পরবর্তী পদক্ষেপ গণনা করতে অনেক বেশি সময় ব্যয় করে।

অ্যান্ড্রয়েডে, ActivityManager এবং WindowManager সিস্টেম পরিষেবাগুলির দ্বারা অ্যাপের প্রতিক্রিয়াশীলতা নিরীক্ষণ করা হয়। Android কোনো অ্যাপের জন্য ANR ডায়ালগ প্রদর্শন করে যখন এটি নিম্নলিখিত শর্তগুলির মধ্যে একটি শনাক্ত করে:

  • কোনো ইনপুট ইভেন্টের কোনো প্রতিক্রিয়া নেই—যেমন কী প্রেস বা স্ক্রিন ট্যাপ ইভেন্ট—5 সেকেন্ডের মধ্যে।
  • একটি BroadcastReceiver 10 থেকে 20 সেকেন্ডের মধ্যে কার্যকর করা শেষ করে না, ফোরগ্রাউন্ড উদ্দেশ্যের জন্য। আরও তথ্যের জন্য, ব্রডকাস্ট রিসিভার টাইমআউট দেখুন।

ANR এড়িয়ে চলুন

ANR এড়াতে নিম্নলিখিত সাধারণ টিপস। বিভিন্ন ধরণের ANR নির্ণয় এবং ডিবাগ করার বিষয়ে আরও বিশদ বিবরণের জন্য, এই বিভাগে অন্যান্য পৃষ্ঠাগুলি দেখুন৷

  • প্রধান থ্রেডটি সর্বদা আনব্লক করে রাখুন এবং কৌশলগতভাবে থ্রেড ব্যবহার করুন।

    • অ্যাপের মূল থ্রেডে ব্লকিং বা দীর্ঘ-চলমান ক্রিয়াকলাপগুলি সম্পাদন করবেন না। পরিবর্তে, একটি কর্মী থ্রেড তৈরি করুন এবং সেখানে বেশিরভাগ কাজ করুন।

    • মূল থ্রেড এবং অন্যান্য থ্রেডের মধ্যে কোনো লক বিরোধ কমানোর চেষ্টা করুন।

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

    • উপাদানগুলির মধ্যে থ্রেড পুল ভাগ করার সময় সতর্কতা অবলম্বন করুন৷ সম্ভাব্য দীর্ঘ-অবরুদ্ধ ক্রিয়াকলাপ এবং সম্প্রচার গ্রহণের মতো সময়-সংবেদনশীল কাজের জন্য একই থ্রেডগুলি ব্যবহার করবেন না।

  • অ্যাপ স্টার্টআপ দ্রুত রাখুন। অ্যাপের স্টার্টআপ কোডে ধীরগতির বা ব্লকিং ক্রিয়াকলাপগুলিকে ন্যূনতম করুন, যেমন ড্যাগার ইনিশিয়ালাইজেশন চলাকালীন পদ্ধতিগুলি।

  • আপনি যদি BroadcastReceiver ব্যবহার করেন, তাহলে Context.registerReceiver ব্যবহার করে একটি অ-প্রধান থ্রেডে সম্প্রচার রিসিভার চালানোর কথা বিবেচনা করুন। আরও তথ্যের জন্য, BroadcastReceiver-এ ANR দেখুন।

    • আপনি যদি goAsync() ব্যবহার করেন, তাহলে নিশ্চিত করুন যে ANR টাইমআউটের আগে PendingResult.finish দ্রুত কল করা হয়েছে।

ব্রডকাস্ট রিসিভারে ANR

BroadcastReceiver কার্যকর করার সময় সীমাবদ্ধ কারণ ব্রডকাস্ট রিসিভারগুলি পটভূমিতে ছোট, বিচ্ছিন্ন পরিমাণে কাজ করার জন্য বোঝানো হয়, যেমন একটি সেটিং সংরক্ষণ করা বা একটি Notification নিবন্ধন করা। সুতরাং, UI থ্রেডে ডাকা অন্যান্য পদ্ধতির মতো, অ্যাপগুলিকে সম্প্রচার রিসিভারে সম্ভাব্য দীর্ঘমেয়াদী ক্রিয়াকলাপ বা গণনা এড়াতে হবে। UI থ্রেডের মাধ্যমে দীর্ঘ-চলমান কাজগুলি সম্পাদন করার পরিবর্তে, পরবর্তী কার্য সম্পাদনের জন্য পটভূমিতে সেগুলি সম্পাদন করুন। সম্ভাব্য সমাধান সম্পর্কে আরও তথ্যের জন্য পটভূমি কাজের ওভারভিউ দেখুন।

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

প্রতিক্রিয়াশীলতাকে শক্তিশালী করুন

সাধারণত, 100 থেকে 200ms হল থ্রেশহোল্ড যার বাইরে ব্যবহারকারীরা একটি অ্যাপে ধীরগতি অনুভব করেন। আপনার অ্যাপ ব্যবহারকারীদের কাছে প্রতিক্রিয়াশীল বলে মনে করার জন্য এখানে অতিরিক্ত টিপস রয়েছে:

  • যদি আপনার অ্যাপটি ব্যবহারকারীর ইনপুটের প্রতিক্রিয়া হিসাবে ব্যাকগ্রাউন্ডে কাজ করে, তাহলে দেখান যে অগ্রগতি হচ্ছে, যেমন আপনার UI-তে একটি ProgressBar মাধ্যমে।

  • বিশেষ করে গেমগুলির জন্য, একটি কর্মী থ্রেডে চলার জন্য গণনা করুন।

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

  • আপনার অ্যাপের প্রতিক্রিয়াশীলতায় বাধা নির্ধারণ করতে পারফেটো এবং সিপিইউ প্রোফাইলারের মতো পারফরম্যান্স টুল ব্যবহার করুন।