আমি এখন কয়েক মাস ধরে এই সমস্যাটি তদন্ত করেছি, এর বিভিন্ন সমাধান নিয়ে এসেছি, যেহেতু তারা সবাই প্রচুর হ্যাক হওয়ায় আমি এতে সন্তুষ্ট নই। আমি এখনও বিশ্বাস করতে পারি না যে একটি শ্রেণি যা ডিজাইনের ত্রুটিযুক্ত হয়েছিল তা এটিকে কাঠামোর মধ্যে তৈরি করেছে এবং কেউই এটির বিষয়ে কথা বলছে না, তাই আমি অনুমান করি যে আমাকে অবশ্যই কিছু অনুভব করতে হবে।
সমস্যাটিও তাই AsyncTask
। ডকুমেন্টেশন অনুযায়ী এটি
"থ্রেড এবং / অথবা হ্যান্ডলারগুলি পরিচালনা না করে পটভূমি অপারেশন করতে এবং ইউআই থ্রেডে ফলাফল প্রকাশের অনুমতি দেয়।"
এরপরে উদাহরণটি দেখিয়ে চলেছে যে কিছু অনুকরণীয় showDialog()
পদ্ধতি কীভাবে ডাকা হয় onPostExecute()
। এটি অবশ্য আমার কাছে সম্পূর্ণরূপে স্বীকৃত বলে মনে হয় , কারণ একটি ডায়ালগ দেখানোর জন্য সর্বদা Context
একটি বৈধের জন্য একটি রেফারেন্স প্রয়োজন এবং অ্যাসিঙ্কটাসকের কোনও প্রসঙ্গে কোনও বিষয়বস্তুর দৃ never ় রেফারেন্স থাকতে হবে না ।
কারণটি সুস্পষ্ট: যদি ক্রিয়াকলাপটি ধ্বংস হয়ে যায় যা কার্যকে উদ্বুদ্ধ করে? এটি সর্বদা ঘটতে পারে, যেমন আপনি পর্দা উল্টিয়েছেন li যদি টাস্কটি এটি তৈরি করা প্রসঙ্গে একটি রেফারেন্স রাখে, আপনি কেবল একটি অকেজো প্রসঙ্গ অবজেক্ট ধরে থাকবেন না (উইন্ডোটি ধ্বংস হয়ে যাবে এবং কোনও UI ইন্টারঅ্যাকশন ব্যতিক্রম সহ ব্যর্থ হবে!), আপনি এমনকি কোনও ঝুঁকি তৈরির ঝুঁকি তৈরি করবেন মেমরি লিক.
আমার যুক্তি এখানে ত্রুটিযুক্ত না হলে এটি অনুবাদ করে: onPostExecute()
সম্পূর্ণরূপে অকেজো, কারণ আপনার যদি কোনও প্রসঙ্গে অ্যাক্সেস না থাকে তবে এই পদ্ধতিটি ইউআই থ্রেডে চালানো ভাল কি? আপনি এখানে অর্থবহ কিছু করতে পারবেন না।
একটি কাজের সমাধান হ'ল AsyncTask এ প্রসঙ্গে দৃষ্টান্তগুলি না পাঠানো, তবে একটি Handler
উদাহরণ। এটি কাজ করে: যেহেতু কোনও হ্যান্ডলার প্রসঙ্গ এবং কার্যটি আলগাভাবে আবদ্ধ করে, তাই আপনি ফাঁস (ডান?) ঝুঁকি না নিয়েই তাদের মধ্যে বার্তা বিনিময় করতে পারেন। তবে এর অর্থ এই হবে যে অ্যাসিঙ্কটাস্কের ভিত্তিটি হ'ল হ্যান্ডলারদের আপনার বিরক্ত করার দরকার নেই, এটি ভুল। এটি হ্যান্ডলারের সাথে আপত্তিজনক বলে মনে হচ্ছে, যেহেতু আপনি একই থ্রেডে বার্তা প্রেরণ এবং গ্রহণ করছেন (আপনি এটি ইউআই থ্রেডটিতে তৈরি করেন এবং এটি মাধ্যমে পোস্টপেক্সেক্সিউটে () যা ইউআই থ্রেডেও কার্যকর করা হয়)।
এগুলি সর্বোপরি, এমনকি সেই কর্মপরিকল্পনা সত্ত্বেও, আপনার এখনও সমস্যা রয়েছে যে প্রসঙ্গটি ধ্বংস হয়ে গেলে, এটি আপনার দ্বারা চালিত কার্যগুলির কোনও রেকর্ড নেই । এর অর্থ হ'ল প্রসঙ্গটি পুনরায় তৈরি করার সময় আপনাকে যে কোনও কাজ পুনরায় শুরু করতে হবে, যেমন পর্দার ওরিয়েন্টেশন পরিবর্তনের পরে। এটি ধীর এবং অপচয়হীন।
এর আমার সমাধান (যেমন ড্রয়েড-ফু লাইব্রেরিতে প্রয়োগ করা হয়েছে ) হ'ল WeakReference
উপাদানগুলির নাম থেকে তাদের বর্তমান দৃষ্টান্তগুলিতে অনন্য অ্যাপ্লিকেশন অবজেক্টে ম্যাপিং রক্ষা করা । যখনই কোনও অ্যাসিঙ্কটাস্ক শুরু হয়, এটি সেই মানচিত্রে কলিং প্রসঙ্গে রেকর্ড করে এবং প্রতিটি কলব্যাকে, এটি ম্যাপিং থেকে বর্তমান প্রসঙ্গের উদাহরণটি আনবে। এটি নিশ্চিত করে যে আপনি কখনই কোনও বাসি প্রসঙ্গের উদাহরণটি উল্লেখ করবেন না এবং কলব্যাকগুলিতে আপনার সর্বদা কোনও বৈধ প্রসঙ্গে অ্যাক্সেস রয়েছে যাতে আপনি সেখানে অর্থবহ UI কাজ করতে পারেন। এটি ফাঁসও করে না, কারণ উল্লেখগুলি দুর্বল এবং যখন প্রদত্ত উপাদানগুলির কোনও উদাহরণ উপস্থিত নেই তখন তা সাফ হয়ে যায়।
তবুও, এটি একটি জটিল কাজ এবং এটি একটি চমত্কার অনুপ্রেরণীয় পদ্ধতির তৈরি করে কিছু ড্রড-ফু গ্রন্থাগার ক্লাসের উপ-শ্রেণীর প্রয়োজন।
এখন আমি কেবল জানতে চাই: আমি কি কেবলমাত্র কিছুটা হারিয়েছি বা অ্যাসিঙ্কটাস্ক আসলেই পুরোপুরি ত্রুটিযুক্ত? আপনার অভিজ্ঞতাগুলি এটির সাথে কীভাবে কাজ করছে? আপনি কীভাবে এই সমস্যার সমাধান করলেন?
আপনার ইনপুট জন্য ধন্যবাদ।