হ্যান্ডলার বনাম অ্যাসিঙ্কটাস্ক


128

আমি হ্যান্ডলারের মাধ্যমে কে কখন অ্যাসিঙ্কটাস্ককে বেছে নেবে তা নিয়ে আমি বিভ্রান্ত। বলুন আমার কাছে কিছু কোড রয়েছে যা আমি প্রতি এন সেকেন্ডে চালাতে চাই যা ইউআই আপডেট করে। কেন আমি একজনকে অন্যের থেকে বেছে নেব?


1
এটি অ্যাসিঙ্কটাস্কলয়েডারদের সাথে আরও জটিল হয়ে উঠেছে। আরও তথ্যের জন্য stackoverflow.com/q/7120813/969325 দেখুন ।
ওয়ারপজিট

উত্তর:


75

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

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

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


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

5
হানিকম্ব অন থেকে, AsyncTasksএকটি থ্রেডে মৃত্যুদন্ড কার্যকর করা হয়, সুতরাং আর কোনও সমান্তরালতা নেই। আপনি এখনও তাদের প্যারালেল Executorপ্রয়োগে চালাতে পারেন ।
মিঃস্নোফ্লেকে

63

আমার থাম্ব নিয়ম হবে:

  • আপনি যদি ইউআই সম্পর্কিত কোনও বিচ্ছিন্ন কিছু করছেন, উদাহরণস্বরূপ একটি তালিকায় উপস্থাপনের জন্য ডেটা ডাউনলোড করা, এগিয়ে যান এবং ব্যবহার করুন AsyncTask

  • আপনি যদি একাধিক পুনরাবৃত্ত কাজ করছেন, উদাহরণস্বরূপ একাধিক চিত্র ডাউনলোড করা যা ডাউনলোডের পরে প্রদর্শিত হবে ImageViews(যেমন থাম্বনেইল ডাউনলোড করা), সাথে একটি টাস্ক সারি ব্যবহার করুন Handler


হ্যান্ডলারটি এপিআই স্তরের 1 এবং এপিআই স্তরে ASYNCTASK 3 এ রয়েছে এটি কোনও মূল্যে হ্রাস করা হবে? বেকাজ পুরানো সংস্করণগুলি থেকে 2.2 এবং 2.3 তে অ্যাপ্লিকেশনগুলি পোর্টিংয়ে মনোনিবেশ করছে
ইয়োকস

10
উভয়ই শীঘ্রই যে কোনও সময় হ্রাস করা হবে না। মূলত ইউআইটি এর চারপাশে তৈরি হওয়ায় হ্যান্ডলারটিকে কখনও হ্রাস করা হবে না।
আলেকান্দ্রবার্লম

আপনার ইউআই উপস্থাপনের জন্য ডেটা লোড করার জন্য কোনও লোডার ব্যবহার করা উচিত নয়?
nbarraille

19

মূলত নিম্নলিখিত কারণে যখন সম্ভব হয় তখন অ্যাসিঙ্কটাস্কটি এড়াতে সর্বদা চেষ্টা করুন:

  • সিস্টেম দ্বারা সেট করা একটি থ্রেডপুল বেস এবং সর্বাধিক আকার রয়েছে এবং আপনি যদি খুব বেশি সংশ্লেষ তৈরি করেন তবে অবশেষে এটি ধ্বংস হয়ে যাবে বলে অ্যাসিঙ্কটাস্ক চালানোর গ্যারান্টিযুক্ত নয়

  • ক্রিয়াকলাপের জীবনচক্রের উপর নির্ভর করে চলমান অবস্থায়ও অ্যাসিঙ্কটাস্ক স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যেতে পারে এবং এতে আপনার কোনও নিয়ন্ত্রণ নেই

  • ইউএন থ্রেডে চলমান অ্যাসিঙ্কটাস্ক পদ্ধতিগুলি যেমন onPostExecute ব্যবহার করা হয় তখন কার্যকর করা যেতে পারে যখন এটি যে ক্রিয়াকলাপটি উল্লেখ করছে, তা আর দৃশ্যমান নয়, বা সম্ভবত কোনও ভিন্ন বিন্যাসের অবস্থানে যেমন ওরিয়েন্টেশন পরিবর্তনের পরে।

উপসংহারে আপনারা AsyncTask এর UIThread- সংযুক্ত পদ্ধতি ব্যবহার করবেন না, এটি এর প্রধান সুবিধা !!! তদতিরিক্ত, আপনার কেবল doInBackground এ অ সমালোচনামূলক কাজ করা উচিত। এই সমস্যাগুলি সম্পর্কে আরও অন্তর্দৃষ্টিগুলির জন্য এই থ্রেডটি পড়ুন:

অ্যাসিঙ্কটাস্ক আসলেই ধারণাগতভাবে ত্রুটিযুক্ত বা আমি কিছু হারিয়ে যাচ্ছি?

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


হ্যাঁ, অ্যাসিঙ্কটাস্কের অনেকগুলি ব্যবহারের জন্য আমি অনেক সময় ব্যয় করেছি spent এগুলি দুর্দান্ত বলে মনে হচ্ছে, তবে ... অনেক সমস্যা!
এসএমবিগস

6
আমি আপনার পয়েন্টগুলির বিরুদ্ধে এত দৃ strongly়তার সাথে পোস্ট করার জন্য দুঃখিত, তবে আমি আপনার দুর্বল স্টাইলের প্রভাবটিকে অ্যান্ড্রয়েডে ছাড়তে দিতে পারি না। পয়েন্ট এক। আপনার এমন অনেক থ্রেড চলবে না। আপনি যদি এটি জুড়ে আসেন তবে আপনার আর্কিটেকচারটি ফুবার। পয়েন্ট ২ কীভাবে পৃথিবীতে .. ঠিক আছে, হ্যাঁ অ্যান্ড্রয়েডের সমস্ত কিছুই আবর্জনা সংগ্রাহকের কাছে ফ্রি গেম ... আপনি কেবল কিছু বর্ণিত কঠোরভাবে আপত্তিজনক ক্ষেত্রে উপরোক্ত বর্ণনাকৃত অভ্যাসযুক্ত আচরণ দেখতে পাবেন। পয়েন্ট ৩. আপনার কাজ পরিচালনা করা, অভদ্র হওয়া নয়, একটি আভিজাত্য দক্ষতা। আপনি হয়পেজ কল করার সময় আপনি এটি মেরে ফেলবেন, অথবা আপনি যথাযথভাবে আলাদা করে সেই অনুসারে সংযুক্ত করুন।
স্টারউইন্ড0

1
vogella.com / টিউটোরিয়ালস / অ্যান্ড্রয়েডব্যাকগ্রাউন্ডপ্রসেসিং / আর্টিক্যাল এইচটিএমএল উপরের সমস্যাগুলি ছাড়াই কীভাবে সঠিকভাবে কাজগুলি করা যায় তা শিখার জন্য আপনাকে এটাই দরকার (ধরে
নিই যে আপনি

16

আপনি যদি প্রতি x সেকেন্ডে একটি গণনা করতে চান, আপনার সম্ভবত Runnableএকটি Handler(সহ postDelayed()) এর উপর একটি সময় নির্ধারণ করা Runnableউচিত এবং এটি বর্তমান ইউআই থ্রেডে শুরু হওয়া উচিত। আপনি যদি এটি অন্য থ্রেডে শুরু করতে চান তবে হ্যান্ডলারথ্রেড ব্যবহার করুন। অ্যাসিঙ্কটাস্ক আমাদের জন্য ব্যবহার করা সহজ তবে হ্যান্ডলারের চেয়ে ভাল আর নয়।


7

হ্যান্ডলার অ্যাপ্লিকেশনটির মূল থ্রেডের সাথে সম্পর্কিত। এটি অ্যাপ্লিকেশন মূল থ্রেডে ব্যাকগ্রাউন্ড থ্রেড থেকে প্রেরিত বার্তা এবং রানওয়েবলগুলি পরিচালনা করে এবং শিডিয়ুল করে।

অ্যাসিনটাস্ক সময় সাপেক্ষে ক্রিয়াকলাপগুলি অবরুদ্ধ না করে ইউআই আপডেট করার জন্য পটভূমি থ্রেডগুলি পরিচালনা করার জন্য একটি সহজ পদ্ধতি সরবরাহ করে।

উত্তরটি হ'ল উভয়ই ব্যাকগ্রাউন্ড থ্রেড থেকে ইউআই আপডেট করার জন্য ব্যবহার করা যেতে পারে, পার্থক্যটি আপনার সম্পাদনের দৃশ্যে হবে। আপনি হ্যান্ডলারটি ব্যবহারের বিষয়ে বিবেচনা করতে পারেন যা আপনি বিলম্বিত বার্তাগুলি পোস্ট করতে চান বা একটি নির্দিষ্ট ক্রমে ম্যাসেজকিউতে বার্তা প্রেরণ করতে চান।

আপনি অ্যাপল মুখ্য থ্রেড এবং ব্যাকগ্রাউন্ড থ্রেডের মধ্যে কোনও সহজ উপায় হিসাবে প্যারামিটারগুলি (এভাবে UI আপডেট করা) বিনিময় করতে চাইলে আপনি AsyncTask ব্যবহার বিবেচনা করতে পারেন।


3
আপনি অন্য থ্রেডের সাথে যুক্ত নিজের হ্যান্ডলার তৈরি করতে পারেন।
আলেকসেজেস মজালিকস

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

2

AsyncTaskঅনুমান করা হয় যে আপনি কিছু পটভূমি কাজ শেষ হওয়ার পরে, ইউআই থ্রেডে কিছু করবেন। এছাড়াও, আপনি কেবল একবার এটি সম্পাদন করতে পারেন (এর পরে, এর স্থিতিটি রয়েছে FINISHEDএবং আপনি আরও একবার এটি কার্যকর করার চেষ্টা করে একটি ব্যতিক্রম পাবেন)। এছাড়াও, এটি ব্যবহারের নমনীয়তা খুব বেশি নয়। হ্যাঁ, আপনি THREAD_POOL_EXECUTORএকটি সমান্তরাল মৃত্যুদন্ডের জন্য ব্যবহার করতে পারেন , তবে চেষ্টাটি উপযুক্ত নয়।

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

এখানে বিভিন্ন ধরণের Handlerউদাহরণ পরীক্ষা করুন


0

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

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


0

doInBackground - মূলত অন্য থ্রেডে কাজ করে। onPostExecute - ইউআই থ্রেডে ফলাফল পোস্ট করে এবং এটি অভ্যন্তরীণভাবে মূল থ্রেডের হ্যান্ডলারের কাছে বার্তা প্রেরণ করছে। প্রধান ইউআই থ্রেড এর সাথে ইতিমধ্যে একটি লুপার এবং হ্যান্ডলার যুক্ত রয়েছে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.