আমি হ্যান্ডলারের মাধ্যমে কে কখন অ্যাসিঙ্কটাস্ককে বেছে নেবে তা নিয়ে আমি বিভ্রান্ত। বলুন আমার কাছে কিছু কোড রয়েছে যা আমি প্রতি এন সেকেন্ডে চালাতে চাই যা ইউআই আপডেট করে। কেন আমি একজনকে অন্যের থেকে বেছে নেব?
আমি হ্যান্ডলারের মাধ্যমে কে কখন অ্যাসিঙ্কটাস্ককে বেছে নেবে তা নিয়ে আমি বিভ্রান্ত। বলুন আমার কাছে কিছু কোড রয়েছে যা আমি প্রতি এন সেকেন্ডে চালাতে চাই যা ইউআই আপডেট করে। কেন আমি একজনকে অন্যের থেকে বেছে নেব?
উত্তর:
আইএমও, অ্যাসিঙ্কটাসকে নিম্ন-স্তরের বিশদ (থ্রেড, বার্তা লুপ ইত্যাদি) সম্পর্কে খুব বেশি চিন্তা না করেই অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে ব্যাকগ্রাউন্ড প্রসেসিং অর্জনের সুবিধামত, সহজেই ব্যবহারের সহজ উপায় সরবরাহ করতে লেখা হয়েছিল। এটি কলব্যাক পদ্ধতিগুলি সরবরাহ করে যা কার্যগুলি নির্ধারণ করতে এবং যখনই প্রয়োজন হয় সহজেই ইউআই আপডেট করতে সহায়তা করে।
তবে, এটি লক্ষণীয় গুরুত্বপূর্ণ যে অ্যাসিঙ্কটাস্ক ব্যবহার করার সময়, একজন বিকাশকারী তার সীমাবদ্ধতার কাছে জমা দিচ্ছেন, যার ফলশ্রুতি শ্রেণীর লেখক যে নকশার সিদ্ধান্ত নিয়েছিলেন তার ফলস্বরূপ। উদাহরণস্বরূপ আমি সম্প্রতি জানতে পেরেছি যে AsyncTasks ব্যবহার করে তফসিল করা যায় এমন কাজের সংখ্যার সীমা রয়েছে।
হ্যান্ডলার এই দুটিয়ের তুলনায় আরও স্বচ্ছ এবং সম্ভবত আপনাকে আরও স্বাধীনতা দেয়; সুতরাং আপনি যদি হ্যান্ডলারের পছন্দ করেন এমন জিনিসগুলিতে আপনি আরও নিয়ন্ত্রণ চান তবে অন্যথায় অ্যাসিনটাস্ক ঠিক কাজ করবে।
AsyncTasksএকটি থ্রেডে মৃত্যুদন্ড কার্যকর করা হয়, সুতরাং আর কোনও সমান্তরালতা নেই। আপনি এখনও তাদের প্যারালেল Executorপ্রয়োগে চালাতে পারেন ।
আমার থাম্ব নিয়ম হবে:
আপনি যদি ইউআই সম্পর্কিত কোনও বিচ্ছিন্ন কিছু করছেন, উদাহরণস্বরূপ একটি তালিকায় উপস্থাপনের জন্য ডেটা ডাউনলোড করা, এগিয়ে যান এবং ব্যবহার করুন AsyncTask।
আপনি যদি একাধিক পুনরাবৃত্ত কাজ করছেন, উদাহরণস্বরূপ একাধিক চিত্র ডাউনলোড করা যা ডাউনলোডের পরে প্রদর্শিত হবে ImageViews(যেমন থাম্বনেইল ডাউনলোড করা), সাথে একটি টাস্ক সারি ব্যবহার করুন Handler।
মূলত নিম্নলিখিত কারণে যখন সম্ভব হয় তখন অ্যাসিঙ্কটাস্কটি এড়াতে সর্বদা চেষ্টা করুন:
সিস্টেম দ্বারা সেট করা একটি থ্রেডপুল বেস এবং সর্বাধিক আকার রয়েছে এবং আপনি যদি খুব বেশি সংশ্লেষ তৈরি করেন তবে অবশেষে এটি ধ্বংস হয়ে যাবে বলে অ্যাসিঙ্কটাস্ক চালানোর গ্যারান্টিযুক্ত নয়
ক্রিয়াকলাপের জীবনচক্রের উপর নির্ভর করে চলমান অবস্থায়ও অ্যাসিঙ্কটাস্ক স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যেতে পারে এবং এতে আপনার কোনও নিয়ন্ত্রণ নেই
ইউএন থ্রেডে চলমান অ্যাসিঙ্কটাস্ক পদ্ধতিগুলি যেমন onPostExecute ব্যবহার করা হয় তখন কার্যকর করা যেতে পারে যখন এটি যে ক্রিয়াকলাপটি উল্লেখ করছে, তা আর দৃশ্যমান নয়, বা সম্ভবত কোনও ভিন্ন বিন্যাসের অবস্থানে যেমন ওরিয়েন্টেশন পরিবর্তনের পরে।
উপসংহারে আপনারা AsyncTask এর UIThread- সংযুক্ত পদ্ধতি ব্যবহার করবেন না, এটি এর প্রধান সুবিধা !!! তদতিরিক্ত, আপনার কেবল doInBackground এ অ সমালোচনামূলক কাজ করা উচিত। এই সমস্যাগুলি সম্পর্কে আরও অন্তর্দৃষ্টিগুলির জন্য এই থ্রেডটি পড়ুন:
অ্যাসিঙ্কটাস্ক আসলেই ধারণাগতভাবে ত্রুটিযুক্ত বা আমি কিছু হারিয়ে যাচ্ছি?
উপরোক্ত উদ্ধৃত সমস্যাগুলির মধ্যে যে কোনওটি আপনার জন্য উদ্বেগের কারণ হয়ে উঠলে অ্যাসিঙ্কটাস্কের পরিবর্তে ইনটেন্টসার্ভিস, হ্যান্ডলারথ্রেড বা থ্রেডপুলএক্সিকিউটর ব্যবহার করার সিদ্ধান্ত নেওয়ার চেষ্টা করুন। অবশ্যই এটি আরও বেশি কাজের প্রয়োজন তবে আপনার প্রয়োগটি আরও নিরাপদ হবে be
আপনি যদি প্রতি x সেকেন্ডে একটি গণনা করতে চান, আপনার সম্ভবত Runnableএকটি Handler(সহ postDelayed()) এর উপর একটি সময় নির্ধারণ করা Runnableউচিত এবং এটি বর্তমান ইউআই থ্রেডে শুরু হওয়া উচিত। আপনি যদি এটি অন্য থ্রেডে শুরু করতে চান তবে হ্যান্ডলারথ্রেড ব্যবহার করুন। অ্যাসিঙ্কটাস্ক আমাদের জন্য ব্যবহার করা সহজ তবে হ্যান্ডলারের চেয়ে ভাল আর নয়।
হ্যান্ডলার অ্যাপ্লিকেশনটির মূল থ্রেডের সাথে সম্পর্কিত। এটি অ্যাপ্লিকেশন মূল থ্রেডে ব্যাকগ্রাউন্ড থ্রেড থেকে প্রেরিত বার্তা এবং রানওয়েবলগুলি পরিচালনা করে এবং শিডিয়ুল করে।
অ্যাসিনটাস্ক সময় সাপেক্ষে ক্রিয়াকলাপগুলি অবরুদ্ধ না করে ইউআই আপডেট করার জন্য পটভূমি থ্রেডগুলি পরিচালনা করার জন্য একটি সহজ পদ্ধতি সরবরাহ করে।
উত্তরটি হ'ল উভয়ই ব্যাকগ্রাউন্ড থ্রেড থেকে ইউআই আপডেট করার জন্য ব্যবহার করা যেতে পারে, পার্থক্যটি আপনার সম্পাদনের দৃশ্যে হবে। আপনি হ্যান্ডলারটি ব্যবহারের বিষয়ে বিবেচনা করতে পারেন যা আপনি বিলম্বিত বার্তাগুলি পোস্ট করতে চান বা একটি নির্দিষ্ট ক্রমে ম্যাসেজকিউতে বার্তা প্রেরণ করতে চান।
আপনি অ্যাপল মুখ্য থ্রেড এবং ব্যাকগ্রাউন্ড থ্রেডের মধ্যে কোনও সহজ উপায় হিসাবে প্যারামিটারগুলি (এভাবে UI আপডেট করা) বিনিময় করতে চাইলে আপনি AsyncTask ব্যবহার বিবেচনা করতে পারেন।
AsyncTaskঅনুমান করা হয় যে আপনি কিছু পটভূমি কাজ শেষ হওয়ার পরে, ইউআই থ্রেডে কিছু করবেন। এছাড়াও, আপনি কেবল একবার এটি সম্পাদন করতে পারেন (এর পরে, এর স্থিতিটি রয়েছে FINISHEDএবং আপনি আরও একবার এটি কার্যকর করার চেষ্টা করে একটি ব্যতিক্রম পাবেন)। এছাড়াও, এটি ব্যবহারের নমনীয়তা খুব বেশি নয়। হ্যাঁ, আপনি THREAD_POOL_EXECUTORএকটি সমান্তরাল মৃত্যুদন্ডের জন্য ব্যবহার করতে পারেন , তবে চেষ্টাটি উপযুক্ত নয়।
Handlerরান্নেবল এবং বার্তাগুলি পরিচালনা ছাড়া কিছু ভাবেনা। এছাড়াও, এটি আপনার ইচ্ছামত যতবার চালানো যেতে পারে । এটি কোন থ্রেডের সাথে সংযুক্ত করা উচিত, এটি অন্যান্য হ্যান্ডলারের সাথে কীভাবে যোগাযোগ করে, সম্ভবত সেগুলি উত্পাদন করে তা নির্ধারণ করতে আপনি নির্দ্বিধায় রয়েছেন HandlerThread। সুতরাং, এটি অনেক বেশি নমনীয় এবং কিছু পুনরাবৃত্তি কাজের জন্য উপযুক্ত।
তারা সেরা সাক্ষাত্কার প্রশ্ন যা জিজ্ঞাসা করা হয়। অ্যাসিঙ্কটাস্ক - এগুলি ইউআই থ্রেডের অফলোড এবং পটভূমিতে কাজগুলি করতে ব্যবহৃত হয়। হ্যান্ডলারগুলি - অ্যান্ড্রয়েড ডোজেন্টের ইউআই এবং ব্যাকগ্রাউন্ড থ্রেডের মধ্যে সরাসরি যোগাযোগের উপায় রয়েছে। বার্তাগুলি প্রেরণের জন্য হ্যান্ডলারগুলি অবশ্যই ব্যবহার করতে হবে বা বার্তার কিউয়ের মাধ্যমে চলমান।
সুতরাং অ্যাসিঙ্কটাস্কগুলি ব্যবহৃত হয় যেখানে পটভূমিতে কার্য সম্পাদনের প্রয়োজন হয় এবং হ্যান্ডলারগুলি ইউআই এবং ব্যাকগ্রাউন্ড থ্রেডের মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়।
doInBackground - মূলত অন্য থ্রেডে কাজ করে। onPostExecute - ইউআই থ্রেডে ফলাফল পোস্ট করে এবং এটি অভ্যন্তরীণভাবে মূল থ্রেডের হ্যান্ডলারের কাছে বার্তা প্রেরণ করছে। প্রধান ইউআই থ্রেড এর সাথে ইতিমধ্যে একটি লুপার এবং হ্যান্ডলার যুক্ত রয়েছে।
সুতরাং মূলত, যদি আপনাকে কিছু পটভূমি কাজ করতে হয় তবে অ্যাসিঙ্কটাস্ক ব্যবহার করুন। তবে শেষ পর্যন্ত, যদি ইউআইতে কিছু আপডেট করার প্রয়োজন হয় তবে এটি মূল থ্রেডের হ্যান্ডলারটি ব্যবহার করবে।