হ্যান্ডলার বনাম অ্যাসিঙ্কটাস্ক বনাম থ্রেড [বন্ধ]


382

আমি সামান্য ভিন্নতা নিয়ে বিভ্রান্ত হন Handlers, AsyncTaskএবং Threadsঅ্যান্ড্রয়েড হবে। আমি স্ট্যাকওভারফ্লোতে বেশ কয়েকটি ব্লগ এবং প্রশ্নগুলি পড়েছি।

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

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

Threadতবে ইউআই এর সাথে ইন্টারঅ্যাক্ট করতে পারে না, আরও "বেসিক" থ্রেডিং সরবরাহ করে এবং এর সমস্ত বিমূর্ততা মিস করে AsyncTask

যাইহোক, আমি পরিষেবাটিতে সকেট সংযোগ চালু করতে চাই have এটি কি কোনও হ্যান্ডলার বা থ্রেডে চালানো উচিত, বা এমনকি কোনও AsyncTask? UI মিথস্ক্রিয়া মোটেই প্রয়োজন হয় না। আমি ব্যবহার করি এমন পারফরম্যান্সের ক্ষেত্রে এটি কী কোনও পার্থক্য আনবে?

ইতোমধ্যে ডকুমেন্টেশনটি মূলত উন্নত করা হয়েছে।



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

উত্তর:


57

হ্যান্ডলারের সাথে অ্যান্ড্রয়েড ব্যাকগ্রাউন্ড প্রসেসিংয়ের টিউটোরিয়াল হিসাবে , ভোগেলা সাইটে অ্যাসিঙ্কটাস্ক এবং লোডারগুলি এতে লিখেছে:

Handlerবর্গ একটি থ্রেড রেজিস্টার করতে ব্যবহার করা যাবে এবং এই থ্রেড ডেটা প্রেরণ করার একটি সহজ চ্যানেল প্রদান করে।

AsyncTaskবর্গ একটি ব্যাকগ্রাউন্ড প্রক্রিয়ার তৈরি এবং মূল থ্রেড সাথে সিঙ্ক্রোনাইজেশান encapsulates। এটি চলমান কার্যগুলির অগ্রগতির প্রতিবেদনকে সমর্থন করে।

এবং Threadএ মূলত মাল্টিথ্রেডিংয়ের মূল উপাদান যা কোনও বিকাশকারী নিম্নলিখিত অসুবিধাগুলি সহ ব্যবহার করতে পারেন:

আপনি যদি জাভা থ্রেড ব্যবহার করেন তবে আপনাকে নিজের কোডে নিম্নলিখিত প্রয়োজনীয়তাগুলি পরিচালনা করতে হবে:

  • আপনি যদি ব্যবহারকারী ইন্টারফেসে ফলাফলগুলি আবার পোস্ট করেন তবে মূল থ্রেডের সাথে সিঙ্ক্রোনাইজেশন
  • থ্রেড বাতিল করার জন্য কোনও ডিফল্ট নয়
  • কোনও ডিফল্ট থ্রেড পুলিং নেই
  • অ্যান্ড্রয়েডে কনফিগারেশন পরিবর্তনগুলি পরিচালনা করার জন্য কোনও ডিফল্ট নয়

আর সংক্রান্ত AsyncTask, যেমন অ্যান্ড্রয়েড উন্নয়নকারীর রেফারেন্স রাখে এটা:

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

AsyncTaskএকটি সাহায্যকারী বর্গ কাছাকাছি হতে ডিজাইন করা হয়েছে Threadএবং Handler এবং একটি জেনেরিক থ্রেডিং ফ্রেমওয়ার্ক গঠন করে না। অ্যাসিঙ্কটাস্কগুলি আদর্শভাবে সংক্ষিপ্ত ক্রিয়াকলাপের জন্য ব্যবহার করা উচিত (সর্বাধিক কয়েক সেকেন্ড) threads এক্সিকিউটার, থ্রেডপুলএক্সেকিউটার এবং ফিউচারটাস্ক।

আপডেট মে 2015: আমি এই বিষয়টি কভার করে একটি দুর্দান্ত সিরিজের বক্তৃতা পেয়েছি ।

এটি গুগল অনুসন্ধান: ডগলাস শ্মিড্ট বক্তৃতা অ্যান্ড্রয়েড সম্মতি এবং সিঙ্ক্রোনাইজেশন

এটি ইউটিউবে প্রথম বক্তৃতার ভিডিও

এগুলি সমস্তই সিএস 282 (2013) এর অংশ: ভ্যান্ডারবিল্ট বিশ্ববিদ্যালয় থেকে অ্যান্ড্রয়েডের জন্য সিস্টেমস প্রোগ্রামিং । এখানে ইউটিউব প্লেলিস্ট

ডগলাস শ্মিড্ট মনে হয় একটি দুর্দান্ত প্রভাষক

গুরুত্বপূর্ণ: আপনি যদি এমন এক পর্যায়ে থাকেন যেখানে আপনি AsyncTaskআপনার থ্রেডিংয়ের সমস্যাগুলি সমাধান করার জন্য ব্যবহার করার বিষয়টি বিবেচনা করছেন , আপনার প্রথমে সম্ভবত আরও উপযুক্ত প্রোগ্রামিং প্যাটার্নটি পরীক্ষা করাReactiveX/RxAndroid উচিত । ওভারভিউ পাওয়ার জন্য খুব ভাল সংস্থানটি উদাহরণস্বরূপ অ্যান্ড্রয়েডের জন্য আরএক্সজেভা 2 শিখছে


4
সেই বক্তৃতা সিরিজের এই লিঙ্কটি আপনাকে কিছু থ্রেড উদাহরণগুলিতে নিয়ে যাবে: youtu.be/4Vue_KuXfCk?t=19m24s
আগ্রাসক

353

যদি আমরা উত্স কোডটি লক্ষ্য করি তবে আমরা দেখতে পাবো AsyncTaskএবং Handlerজাভাতে খাঁটিভাবে লেখা আছে। (যদিও কিছু ব্যতিক্রম আছে। তবে এটি কোনও গুরুত্বপূর্ণ বিষয় নয়)

সুতরাং AsyncTaskবা কোন জাদু নেই Handler। এই ক্লাসগুলি বিকাশকারী হিসাবে আমাদের জীবনকে আরও সহজ করে তোলে।

উদাহরণস্বরূপ: প্রোগ্রাম এ-তে কল ক পদ্ধতি যদি (), পদ্ধতি এ () প্রোগ্রাম এ এর ​​সাথে আলাদা থ্রেডে চলতে পারে তবে আমরা নিম্নলিখিত কোডের মাধ্যমে সহজেই যাচাই করতে পারি:

Thread t = Thread.currentThread();    
int id = t.getId();

কিছু কাজের জন্য আমাদের কেন একটি নতুন থ্রেড ব্যবহার করা উচিত? আপনি এটির জন্য গুগল করতে পারেন। অনেকগুলি কারণ, যেমন: ভারী উত্তোলন, দীর্ঘকালীন কাজ।

সুতরাং, মধ্যে পার্থক্য কি কি Thread, AsyncTaskএবং Handler?

AsyncTaskএবং Handlerজাভাতে লেখা হয় (অভ্যন্তরীণভাবে তারা একটি ব্যবহার করে Thread), তাই আমরা যা করতে পারি Handlerবা যা করতে পারি তা আমরা খুব বেশি AsyncTaskব্যবহার করে অর্জন করতে পারি Thread

কি করতে Handlerএবং AsyncTaskসত্যিই সাহায্য করে?

সর্বাধিক সুস্পষ্ট কারণ হ'ল কলার থ্রেড এবং কর্মী থ্রেডের মধ্যে যোগাযোগ। ( কলার থ্রেড : একটি থ্রেড যা কর্মী থ্রেডকে কিছু কার্য সম্পাদন করতে ডাকে A কলার থ্রেডটি অগত্যা ইউআই থ্রেড হতে হবে না)। অবশ্যই, আমরা অন্যভাবে দুটি থ্রেডের মধ্যে যোগাযোগ করতে পারি, তবে থ্রেড সুরক্ষার কারণে অনেকগুলি অসুবিধা (এবং বিপদ) রয়েছে)

এজন্য আমাদের ব্যবহার করা উচিত Handlerএবং AsyncTask। এই ক্লাসগুলি আমাদের বেশিরভাগ কাজ করে, কোন পদ্ধতিগুলি ওভাররাইড করা উচিত তা কেবল আমাদের জানতে হবে।

Handlerএবং এর মধ্যে পার্থক্য AsyncTask: কলার থ্রেডটিAsyncTask যখন কোনও ইউআই থ্রেড হয় তখন ব্যবহার করুন । অ্যান্ড্রয়েড ডকুমেন্ট এটি বলে:

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

আমি দুটি বিষয়কে গুরুত্ব দিতে চাই:

1) ইউআই থ্রেডের সহজ ব্যবহার (সুতরাং, কলার থ্রেড যখন ইউআই থ্রেড হয় তখন ব্যবহার করুন)।

2) হ্যান্ডলারদের কারসাজির দরকার নেই। (অর্থ: আপনি অ্যাসিঙ্কটাস্কের পরিবর্তে হ্যান্ডলারটি ব্যবহার করতে পারেন, তবে অ্যাসিঙ্কটাস্ক একটি সহজ বিকল্প)।

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

@: আপনি যখন অ্যান্ড্রয়েড ডকুমেন্টটি পড়বেন, আপনি দেখতে পাবেন:

হ্যান্ডলার আপনাকে কোনও থ্রেডের মেসেজকুইয়ের সাথে সম্পর্কিত বার্তা এবং চলমানযোগ্য বস্তু প্রেরণ এবং প্রক্রিয়া করার অনুমতি দেয়

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

জটিল? কেবল মনে রাখবেন যে Handlerকলার থ্রেডের সাথে নিরাপদে যোগাযোগ করতে পারে।


4
আসলে অ্যাসিনটাস্কটি হ্যান্ডলার এবং ভবিষ্যত টাস্কের উপর ভিত্তি করেও দেখুন
সুমিত

হ্যান্ডলার এবং থ্রেডের শীর্ষে অ্যাসিঙ্কটাস্ক মূলত একটি সহায়ক শ্রেণি। বিকাশকারী.অ্যান্ড্রয়েড . com/references/android/os/AsyncTask.html । ডকটি দেখুন "AsyncTask থ্রেড এবং হ্যান্ডলারের আশেপাশে একটি সহায়ক শ্রেণি হিসাবে নকশা করা হয়েছে"। অ্যাসিঙ্কটাস্ক এপিআই 3-এ প্রকাশিত হয়েছে যখন হ্যান্ডলার এপিআই 1 এর পরে থেকেই রয়েছে।
hjchin

52

গভীরতা দেখার পরে, এটি সরাসরি এগিয়ে।

AsyncTask:

জাভা থ্রেড মডেল সম্পর্কে কিছু না জেনে থ্রেডটি ব্যবহার করার একটি সহজ উপায় । AsyncTaskকর্মী থ্রেড এবং মূল থ্রেডের সাথে সম্পর্কিত বিভিন্ন কলব্যাক দেয়।

নীচের মতো ছোট অপেক্ষার ক্রিয়াকলাপের জন্য ব্যবহার করুন:

  1. ওয়েব পরিষেবাগুলি থেকে কিছু ডেটা আনা এবং বিন্যাসের উপরে প্রদর্শন।
  2. ডাটাবেস ক্যোয়ারী।
  3. আপনি যখন বুঝতে পারবেন যে চলমান অপারেশন কখনই বাসা বাঁধবে না।

Handler:

যখন আমরা অ্যান্ড্রয়েডে একটি অ্যাপ্লিকেশন ইনস্টল করি, তখন এটি সেই অ্যাপ্লিকেশনটির জন্য একটি থ্রেড তৈরি করে যার নাম মেইন ইউআই থ্রেড। সমস্ত ক্রিয়াকলাপ সেই থ্রেডের অভ্যন্তরে চলে। অ্যান্ড্রয়েড একক থ্রেড মডেল নিয়ম অনুসারে আমরা সেই ক্রিয়াকলাপের ভিতরে সংজ্ঞায়িত অন্য থ্রেডের জন্য সরাসরি ইউআই উপাদানগুলি (বিটম্যাপ, টেক্সটভিউ, ইত্যাদি access) অ্যাক্সেস করতে পারি না।

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

এটি এর জন্য সেরা ফিট:

  1. এটি আপনাকে বার্তা কাতারে করার অনুমতি দেয়।
  2. বার্তা নির্ধারণ।

Thread:

থ্রেড নিয়ে কথা বলার এখন সময় এসেছে।

থ্রেড উভয়ের পিতা বা মাতা হয় AsyncTaskএবং Handler। তারা উভয় অভ্যন্তরীণভাবে, থ্রেড ব্যবহার যার মানে আপনি আপনার নিজস্ব থ্রেড মডেল তৈরি করতে পারেন মত AsyncTaskএবং Handler, কিন্তু যে একটি ভাল জ্ঞান প্রয়োজন জাভার মাল্টি থ্রেডিং বাস্তবায়ন


1
অ্যাসিঙ্কটাস্ক এপিআই প্রকৃতপক্ষে ফিউচার, হ্যান্ডলারস এবং এক্সিকিউটার্স দিয়ে লেখা। উত্স কোড দেখুন: grepcode.com/file_/repository.grepcode.com/java/ext/…
ইগোরগানাপলস্কি

22

একটি AsyncTaskকিছু পটভূমি গণনা করতে এবং ফলাফলটি ইউআই থ্রেডে প্রকাশ করতে (alচ্ছিক অগ্রগতি আপডেট সহ) ব্যবহৃত হয়। যেহেতু আপনি ইউআই এর সাথে সম্পর্কিত নন তাই একটি Handlerবা Threadআরও উপযুক্ত বলে মনে হচ্ছে।

আপনি একটি ব্যাকগ্রাউন্ড স্প্যান করতে পারেন Threadএবং Handlerএর postপদ্ধতিটি ব্যবহার করে বার্তা আপনার মূল থ্রেডে ফেরত দিতে পারেন ।


9

সুতা

অ্যান্ড্রয়েড স্ট্যান্ডার্ড জাভা থ্রেড সমর্থন করে । আপনি java.util.concurrentব্যাকগ্রাউন্ডে পদক্ষেপ রাখতে স্ট্যান্ডার্ড থ্রেডস এবং প্যাকেজ " " থেকে সরঞ্জামগুলি ব্যবহার করতে পারেন । একমাত্র সীমাবদ্ধতা হ'ল আপনি ব্যাকগ্রাউন্ড প্রক্রিয়া থেকে সরাসরি ইউআই আপডেট করতে পারবেন না।

আপনার যদি ব্যাকগ্রাউন্ড টাস্ক থেকে ইউআই আপডেট করতে হয় তবে আপনার কয়েকটি অ্যান্ড্রয়েড নির্দিষ্ট ক্লাস ব্যবহার করা দরকার। আপনি android.os.Handlerএই বা ক্লাসের জন্য " " ক্লাসটি ব্যবহার করতে পারেন " AsyncTask"

ক্রীড়াশিক্ষক

ক্লাস " Handler" ইউআই আপডেট করতে পারে। একটি হ্যান্ডেল বার্তাগুলি গ্রহণের জন্য এবং রানযোগ্যদের জন্য পদ্ধতি সরবরাহ করে। কোনও হ্যান্ডলার ব্যবহার করতে আপনাকে এটিকে সাবক্লাস করতে হবে এবং handleMessage()বার্তাগুলি প্রক্রিয়া করতে ওভাররাইড করতে হবে । প্রক্রিয়া করার জন্য Runable, আপনি পদ্ধতিটি ব্যবহার করতে পারেন post();আপনার ক্রিয়াকলাপে আপনার কেবলমাত্র হ্যান্ডলারের একটি উদাহরণ প্রয়োজন।

আপনি থ্রেড পদ্ধতি sendMessage(Message msg)বা মাধ্যমে বার্তা পোস্ট করতে পারেন sendEmptyMessage

AsyncTask

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

আরও তথ্যের জন্য আপনি এই লিঙ্কগুলি একবার দেখতে পারেন।

http://mobisys.in/blog/2012/01/android-threads-handlers-and-asynctask-tutorial/

http://www.slideshare.net/HoangNgoBuu/android-thread-handler-and-asynctask


6

Thread:

আপনি Threadইউআই থ্রেডকে প্রভাবিত না করে দীর্ঘ-চলমান ব্যাকগ্রাউন্ড কাজের জন্য নতুনটি ব্যবহার করতে পারেন । জাভা থ্রেড থেকে আপনি ইউআই থ্রেড আপডেট করতে পারবেন না।

যেহেতু সাধারণ থ্রেড অ্যান্ড্রয়েড আর্কিটেকচারের জন্য খুব বেশি কার্যকর না তাই থ্রেডিংয়ের জন্য সহায়ক ক্লাস চালু করা হয়েছে।

থ্রেডিং কর্মক্ষমতা ডকুমেন্টেশন পৃষ্ঠাতে আপনার প্রশ্নের উত্তরগুলি পেতে পারেন ।

হ্যান্ডলার :

একটি Handlerআপনাকে Runnableকোনও থ্রেডের সাথে সম্পর্কিত বার্তা এবং অবজেক্টগুলি প্রেরণ এবং প্রক্রিয়া করার অনুমতি দেয় MessageQueue। প্রতিটি Handlerউদাহরণ একক থ্রেড এবং সেই থ্রেডের বার্তার সারিটির সাথে সম্পর্কিত।

এর জন্য দুটি প্রধান ব্যবহার রয়েছে Handler:

  1. ভবিষ্যতে কিছু পয়েন্ট হিসাবে সম্পাদন করা বার্তা এবং রানওয়েবলদের শিডিউল করতে;

  2. নিজের থেকে আলাদা থ্রেডে করা একটি ক্রিয়াকলাপ তৈরি করতে।

অ্যাসিঙ্কটাস্ক :

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

অপূর্ণতা:

  1. ডিফল্টরূপে, একটি অ্যাপ্লিকেশন AsyncTaskএটি তৈরি করা সমস্ত বস্তুকে একক থ্রেডে ঠেলে দেয় । অতএব, তারা সিরিয়াল ফ্যাশনে সম্পাদন করে এবং the মূল থ্রেড হিসাবে - একটি বিশেষত দীর্ঘ কাজের প্যাকেট সারিটি ব্লক করতে পারে। এই কারণে, কাজের আইটেমের চেয়ে স্বল্প হ্যান্ডেল করতে অ্যাসিঙ্কটাস্ক ব্যবহার করুন সময়কাল মধ্যে 5ms

  2. AsyncTask অন্তর্নিহিত-রেফারেন্স ইস্যুগুলির জন্য অবজেক্টগুলিও সর্বাধিক সাধারণ অপরাধী। AsyncTaskঅবজেক্টস স্পষ্টত উল্লেখগুলি সম্পর্কিত ঝুঁকিগুলিও উপস্থাপন করে।

হ্যান্ডলারথ্রেড :

দীর্ঘ-চলমান থ্রেডে কাজ করার ব্লকটি কার্যকর করতে আপনার আরও traditional তিহ্যগত পদ্ধতির প্রয়োজন হতে পারে ( AsyncTask এর বিপরীতে, যা 5 মিমি কাজের চাপের জন্য ব্যবহার করা উচিত) ) এবং সেই ওয়ার্কফ্লোটি ম্যানুয়ালি পরিচালনা করার কিছু দক্ষতার প্রয়োজন হতে পারে। একটি হ্যান্ডলার থ্রেড কার্যকরভাবে একটি দীর্ঘ-চলমান থ্রেড যা একটি সারি থেকে কাজ ধরে এবং এটিতে কাজ করে।

ThreadPoolExecutor :

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

যদি কাজের চাপ বেশি হয় এবং একা HandlerThreadযথেষ্ট না হয় তবে আপনি যেতে পারেনThreadPoolExecutor

তবে আমি চাই যে সকেট সংযোগটি পরিষেবাতে চালিত হোক। এটি কি কোনও হ্যান্ডলার বা থ্রেডে চালানো উচিত, বা এমন কি অ্যাসিঙ্কটাস্কেও চালানো উচিত? UI মিথস্ক্রিয়া মোটেই প্রয়োজন হয় না। আমি ব্যবহার করি এমন পারফরম্যান্সের ক্ষেত্রে এটি কী কোনও পার্থক্য আনবে?

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

 HandlerThread handlerThread = new HandlerThread("SocketOperation");
 handlerThread.start();
 Handler requestHandler = new Handler(handlerThread.getLooper());
 requestHandler.post(myRunnable); // where myRunnable is your Runnable object. 

আপনি যদি ইউআই থ্রেডে ফিরে যোগাযোগ করতে চান তবে প্রতিক্রিয়া প্রসেস করতে আপনি আরও একটি হ্যান্ডলার ব্যবহার করতে পারেন।

final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //txtView.setText((String) msg.obj);
            Toast.makeText(MainActivity.this,
                    "Foreground task is completed:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

আপনার মধ্যে Runnable, আপনি যোগ করতে পারেন

responseHandler.sendMessage(msg);

বাস্তবায়ন সম্পর্কে আরও বিশদ এখানে পাওয়া যাবে:

অ্যান্ড্রয়েড: একটি থ্রেড টোস্ট


5

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

হালনাগাদ

আমার উপরের উত্তর উপেক্ষা করুন!আমি এই প্রশ্নের জবাব ২০১১ সালে দিয়েছিলাম যখন আমি এখনকার চেয়ে অ্যান্ড্রয়েডে অনেক কম অভিজ্ঞ ছিলাম। আমার উপরের উত্তরটি বিভ্রান্তিকর এবং ভুল হিসাবে বিবেচিত। আমি এটি সেখানে রেখেছি কারণ অনেক লোক আমাকে সংশোধন করার নিচে এটিতে মন্তব্য করেছে এবং আমি আমার পাঠ শিখেছি।

এই থ্রেডে আরও অনেক ভাল উত্তর রয়েছে তবে আমি কমপক্ষে আমাকে আরও সঠিক উত্তর দেব। নিয়মিত জাভা ব্যবহার করে কোনও ভুল নেই Thread; তবে আপনি কীভাবে এটি বাস্তবায়ন করবেন সে সম্পর্কে আপনার সত্যই সতর্ক হওয়া উচিত কারণ এটি ভুল করা খুব প্রসেসর নিবিড় হতে পারে (সবচেয়ে উল্লেখযোগ্য লক্ষণটি আপনার ডিভাইস গরম করা হতে পারে)। AsyncTasks আপনি বেশিরভাগ কাজের জন্য বেশ আদর্শ যা আপনি পটভূমিতে চালাতে চান (সাধারণ উদাহরণগুলি হ'ল ডিস্ক আই / ও, নেটওয়ার্ক কল এবং ডাটাবেস কল)। তবে, AsyncTaskবিশেষত দীর্ঘ প্রক্রিয়াগুলির জন্য ব্যবহার করা উচিত নয় যা ব্যবহারকারীরা আপনার অ্যাপ্লিকেশনটি বন্ধ করে দেওয়ার পরে বা তাদের ডিভাইস স্ট্যান্ডবাইতে রাখার পরে চালিয়ে যেতে পারে। আমি বেশিরভাগ ক্ষেত্রেই বলব, যে কোনও কিছুই ইউআই থ্রেডের অন্তর্ভুক্ত নয়, এটি একটি ক্ষেত্রে যত্ন নেওয়া যেতে পারে AsyncTask


ধন্যবাদ, অ্যাসিঙ্কটাস্কের পরিবর্তে আমার আসলে থ্রেডগুলি ব্যবহার করার কোনও কারণ আছে? বা এটি ব্যবহার করার জন্য আরও প্রস্তাবিত?
অ্যালেক্স

9
@ অ্যারোড্রয়েড আপনার উদাহরণে: "একটি সহজ সময় (সত্য)", আপনি লুপটিতে একটি স্লিপ স্টেট যুক্ত না করলে আপনি এখানে সিপিইউ পেগ করবেন। এটি যে কোনও অন্তহীন লুপের ক্ষেত্রে সত্য। যদি আপনি এই ওভারহেডের কারণে সিপিইউ ব্যবহার হ্রাস করতে চান তবে লুপের শেষে কয়েক মিলিসেকেন্ডের জন্য থ্রেডটি ঘুমান।
ত্রুটি 454

1
@ এরর 454 - এটি আকর্ষণীয়! আপনার যদি ঘুমের সময়টির জন্য উপযুক্ত নম্বর বাছাই করতে হয় তবে এটি 40-80 মিলিসেকেন্ডের মধ্যে হবে?
অভিজিৎ

6
@ অভিজিৎ এসডিএল-এর যে গেম স্টাফগুলি করেছি তা থেকে, লুপে কেবল 10 এমএস ঘুম যোগ করা নিষ্ক্রিয় অবস্থার সময় 99% সিপিইউ থেকে 0 ডলারে নেমে যাওয়ার জন্য যথেষ্ট ছিল।
ত্রুটি 454

15
প্রকৃতপক্ষে বিকাশকারী.অ্যান্ড্রয়েড. com/references/android/os/AsyncTask.html বলেছেন: "সংক্ষিপ্ত ক্রিয়াকলাপের জন্য AsyncTasks আদর্শভাবে ব্যবহার করা উচিত"। আপনার এগুলিও সাবধানে ব্যবহার করা উচিত কারণ এগুলি কার্যকর না করেই সিস্টেম দ্বারা বরখাস্ত করা যেতে পারে!
টাইপ করুন-এএফএ

5

AsyncTaskব্যাকগ্রাউন্ডে কয়েক সেকেন্ডের বেশি অপারেশন না করার জন্য ডিজাইন করা হয়েছে (সার্ভার থেকে ফাইল ডাউনলোডের মেগাবাইটের জন্য বা কম্পিউটার আইপি অপারেশনগুলির মতো সিপিইউ নিবিড় টাস্কের জন্য প্রস্তাবিত নয়)। আপনার যদি দীর্ঘ চলমান অপারেশন চালানোর প্রয়োজন হয় তবে আপনাকে জাভা নেটিভ থ্রেডগুলি ব্যবহার করার জন্য দৃ strongly়ভাবে পরামর্শ দেওয়া হয়েছে। জাভা আপনাকে বিভিন্ন থ্রেড সম্পর্কিত ক্লাস দেয় যা আপনার প্রয়োজন হয় do Handlerইউআই থ্রেড আপডেট করতে ব্যবহার করুন ।


2
public class RequestHandler {

    public String sendPostRequest(String requestURL,
                                  HashMap<String, String> postDataParams) {

        URL url;

        StringBuilder sb = new StringBuilder();
        try {
            url = new URL(requestURL);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);


            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode = conn.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                sb = new StringBuilder();
                String response;
                while ((response = br.readLine()) != null){
                    sb.append(response);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }

        return result.toString();
    }

}

1

আমাকে এখানে একটি উদাহরণ দিয়ে প্রশ্নের উত্তর দেওয়ার চেষ্টা করুন :) - মাই ইমেজসন্ধান [দয়া করে এখানে মূল ক্রিয়াকলাপের চিত্রটি উল্লেখ করুন - এতে সম্পাদনা পাঠ / অনুসন্ধান বোতাম / গ্রিড ভিউ রয়েছে]

MyImageSearch

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

আমার বাস্তবায়ন - মূল ক্রিয়াকলাপে আমি একটি অভ্যন্তর শ্রেণি সংজ্ঞায়িত করব যা doInBackGround পদ্ধতিতে HTTP অনুরোধ প্রেরণের জন্য AsyncTask প্রসারিত করবে এবং JSON প্রতিক্রিয়াটি আনবে এবং আমার স্থানীয় ফ্লিকারিকের অ্যারেলিস্ট আপডেট করবে যা আমি ফ্লিকারআডাপ্টারের মাধ্যমে আমার গ্রিডভিউ আপডেট করার জন্য ব্যবহার করতে যাচ্ছি (বেসএডাপ্টার প্রসারিত করে) এবং গ্রিড ভিউটি পুনরায় লোড করার জন্য অ্যাসিঙ্কটাস্কের onPostExecute () এ অ্যাডাপ্টারে কল করুন notনোটেফাই ডেটাসেটচ্যাঞ্জড ()। মনে রাখবেন যে এখানে HTTP রিকোয়েস্টটি একটি ব্লকিং কল যার কারণে আমি এটি অ্যাসিঙ্কটাস্কের মাধ্যমে করেছি। এবং, আমি পারফরম্যান্স বাড়াতে বা এসডিকার্ডে সঞ্চয় করতে অ্যাডাপ্টারে আইটেমগুলি ক্যাশে করতে পারি। ফ্লিকার অ্যাডাপ্টারে আমি যে গ্রিডটি ফুটিয়ে তুলব তা আমার বাস্তবায়নে একটি অগ্রগতি বার এবং চিত্রের ভিউ ধারণ করে। নীচে আপনি মূলঅ্যাক্টিভিটির জন্য কোডটি সন্ধান করতে পারেন যা আমি ব্যবহার করেছি।

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

  • পছন্দ 1: একটি লুপারথ্রেড তৈরি করুন [থ্রেড প্রসারিত করুন] - এবং এই থ্রেডটি খোলা রেখে ক্রমানুসারে একটি থ্রেডে চিত্রগুলি ডাউনলোড করতে থাকুন [লুপার.লুপ ()]
  • পছন্দ 2: একটি থ্রেড পুল ব্যবহার করুন এবং আমার হ্যান্ডলারের মাধ্যমে চলমানযোগ্য পোস্ট করুন যা আমার চিত্র ভিউয়ের উল্লেখ রয়েছে, তবে গ্রিড ভিউতে যে ভিউগুলি পুনর্ব্যবহার করা হয়েছে, আবার সমস্যা দেখা দিতে পারে যেখানে সূচক 4 এ চিত্রটি সূচী 9 এ প্রদর্শিত হবে [ডাউনলোড হতে পারে আরও সময় নিন]
  • পছন্দ 3 [আমি এটি ব্যবহার করেছি]: একটি থ্রেড পুল ব্যবহার করুন এবং মাই হ্যান্ডলারের কাছে একটি বার্তা প্রেরণ করুন, এতে ইমেজভিউয়ের সূচক এবং ইমেজভিউ সম্পর্কিত ডেটা রয়েছে, তাই হ্যান্ডেলমেসেজ () করার সময় আমরা কেবলমাত্র ইমেজভিউ আপডেট করব যদি বর্তমান ইনডেক্স সূচকের সূচীর সাথে মেলে যে চিত্রটি আমরা ডাউনলোড করার চেষ্টা করেছি।
  • পছন্দ ৪: ব্যাকগ্রাউন্ডে চিত্রগুলি ডাউনলোড করতে অ্যাসিঙ্কটাস্ক ব্যবহার করুন, তবে এখানে থ্রেড পুলটিতে আমার যে পরিমাণ থ্রেড চাই তা অ্যাক্সেস পাবে না এবং এটি বিভিন্ন অ্যান্ড্রয়েড সংস্করণে পরিবর্তিত হয়, তবে চয়েস 3 এ আমি সচেতন সিদ্ধান্ত নিতে পারি ডিভাইস কনফিগারেশন ব্যবহৃত হচ্ছে তার উপর নির্ভর করে থ্রেড পুলের আকার of

উত্স কোড এখানে:

public class MainActivity extends ActionBarActivity {

    GridView imageGridView;
    ArrayList<FlickrItem> items = new ArrayList<FlickrItem>();
    FlickrAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageGridView = (GridView) findViewById(R.id.gridView1);
        adapter = new FlickrAdapter(this, items);
        imageGridView.setAdapter(adapter);
    }

    // To avoid a memory leak on configuration change making it a inner class
    class FlickrDownloader extends AsyncTask<Void, Void, Void> {



        @Override
        protected Void doInBackground(Void... params) {
            FlickrGetter getter = new FlickrGetter();

            ArrayList<FlickrItem> newItems = getter.fetchItems();

            // clear the existing array
            items.clear();

            // add the new items to the array
            items.addAll(newItems);

            // is this correct ? - Wrong rebuilding the list view and should not be done in background
            //adapter.notifyDataSetChanged();

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            adapter.notifyDataSetChanged();
        }

    }

    public void search(View view) {
        // get the flickr data
        FlickrDownloader downloader = new FlickrDownloader();
        downloader.execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

আমি আশা করি আমার উত্তরটি দীর্ঘকালীন কিছু সূক্ষ্ম বিবরণ বুঝতে সাহায্য করবে।


সাদৃশ্যগত কারণে দৃষ্টান্তের ভিত্তিতে আমার ব্যাখ্যা নীচে-ভোট দেওয়া হয়েছে তার কারণটি কি আমি জানতে পারি, যাতে আমিও এটি থেকে শিখি?
অক্ষমণি

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

@ 80leوی ঠিক আছে আমি এখনই বিষয়টিটি পেয়েছি, আমি কীভাবে অন্য উপায়ে একটি উপায় বেছে নেওয়ার সিদ্ধান্তে পৌঁছেছি তা ব্যাখ্যা করার চেষ্টা করেছি। যাইহোক, আমি যা লিখেছি তা সঠিক কিনা বা আরও উন্নত করা যায় কিনা সে সম্পর্কে আপনার / অন্যদের মতামত শুনতে আগ্রহী।
অক্ষয়মানি

1

এটি নির্ভর করে যে কোনটি বেছে নেওয়া প্রয়োজনের ভিত্তিতে

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

হ্যান্ডলারটি থ্রেডটি তৈরি করার সাথে সাথে মূল থ্রেডটি ছাড়া অন্য কোনও তৈরি করা হয়েছে যা লুপ নয় এটি ত্রুটি দেয় না, সেই থ্রেডটিকে লপার তৈরি করা দরকার

অ্যাসিঙ্কটাস্ক কয়েক সেকেন্ডের জন্য কোড সম্পাদন করতে ব্যবহৃত হয় যা ব্যাকগ্রাউন্ড থ্রেডে চলে এবং এর ফলাফলটি মূল থ্রেডকে দেয় ** * অ্যাসিঙ্কটাস্ক সীমাবদ্ধতা ১. কার্যকলাপের জীবনচক্রের সাথে সংযুক্ত থাকে না এবং এটি যদি চালিয়ে যায় তবে এমনকি যদি এটির ক্রিয়াকলাপ ধ্বংস হয় তবে লোডার না করে সমস্ত অ্যাসিঙ্ক কার্য সম্পাদনের জন্য একই পটভূমি থ্রেড ভাগ করে যা অ্যাপ্লিকেশনটির কার্য সম্পাদনকেও প্রভাবিত করে

থ্রেড অ্যাপ্লিকেশনে ব্যাকগ্রাউন্ড কাজের জন্য ব্যবহৃত হয় তবে এটির মূল থ্রেডে কোনও কল ফিরে আসে না। যদি প্রয়োজনের ভিত্তিতে একটি থ্রেডের পরিবর্তে কিছু থ্রেড স্যুট হয় এবং যার জন্য অনেক বার টাস্ক দেওয়া দরকার হয় তবে থ্রেড পুল এক্সিকিউটরটি আরও ভাল বিকল্প like


0

সুতা

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

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

এটি প্রতিরোধ করতে, আপনি শ্রমিকের থ্রেড তৈরি করতে এবং পটভূমি বা দীর্ঘ চলমান কার্যগুলি চালাতে পারেন।

ক্রীড়াশিক্ষক

যেহেতু অ্যান্ড্রয়েড একক থ্রেড মডেল ব্যবহার করে, ইউআই উপাদানগুলি তৈরি করা হয় নন-থ্রেড নিরাপদ অর্থ এটি তৈরি করা থ্রেডটি কেবল তাদের অ্যাক্সেস করা উচিত যার অর্থ ইউআই উপাদানটি কেবলমাত্র মূল থ্রেডে আপডেট হওয়া উচিত। ইউআই উপাদান যেমন মূল থ্রেডে চালিত হয়, কর্মী থ্রেডগুলিতে চালিত টাস্কগুলি ইউআই উপাদানগুলি পরিবর্তন করতে পারে না। এখানেই হ্যান্ডলার ছবিতে আসে। লুপারের সাহায্যে হ্যান্ডলার নতুন থ্রেড বা বিদ্যমান থ্রেডের সাথে সংযোগ করতে পারে এবং এটি সংযুক্ত থ্রেডে থাকা রান কোডে থাকতে পারে।

হ্যান্ডলার আন্তঃ থ্রেড যোগাযোগের জন্য এটি সম্ভব করে তোলে। হ্যান্ডলার ব্যবহার করে, পটভূমি থ্রেড এটিতে ফলাফল পাঠাতে পারে এবং প্রধান থ্রেডের সাথে সংযুক্ত হ্যান্ডলারটি মূল থ্রেডের ইউআই উপাদানগুলি আপডেট করতে পারে।

AsyncTask

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

উদাহরণস্বরূপ দয়া করে অ্যান্ড্রয়েড থ্রেড, হ্যান্ডলার, অ্যাসিনটাস্ক এবং থ্রেড পুল দেখুন


-1

Handler- থ্রেডের মধ্যে যোগাযোগের মাধ্যম। অ্যান্ড্রয়েডে এটি বেশিরভাগ হ্যান্ডলারের মাধ্যমে বার্তা তৈরি এবং প্রেরণ করে মূল থ্রেডের সাথে যোগাযোগ করতে ব্যবহৃত হয়

AsyncTask- ব্যাকগ্রাউন্ড থ্রেডে দীর্ঘ চলমান অ্যাপ্লিকেশনগুলি সম্পাদন করতে ব্যবহৃত হয়। এন এর সাহায্যে AsyncTaskআপনি ব্যাকগ্রাউন্ড থ্রেডে অপারেশন করতে পারবেন এবং অ্যাপ্লিকেশনটির মূল থ্রেডে ফলাফল পেতে পারেন।

Thread- সামঞ্জস্যতা এবং সর্বাধিক সিপিইউ ব্যবহারের জন্য একটি হালকা ওজন প্রক্রিয়া। অ্যান্ড্রয়েডে আপনি এমন ক্রিয়াকলাপ সম্পাদন করতে থ্রেড ব্যবহার করতে পারেন যা অ্যাপ্লিকেশনটির ইউআই স্পর্শ করে না

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