অ্যান্ড্রয়েড: অ্যাসিঙ্কটাস্ক বনাম পরিষেবা


138

আমি কেন এখানে বেশিরভাগ প্রশ্নের উত্তরে AsyncTaskএবং লোডার সম্পর্কে এবং পরিষেবাগুলি সম্পর্কে কিছুই না পড়ি ? পরিষেবাদিগুলি কি কেবল খুব ভালভাবে পরিচিত নয় বা তাদের অবজ্ঞাত বা কিছু খারাপ বৈশিষ্ট্য বা কিছু আছে? পার্থক্য কি?

(যাইহোক, আমি জানি যে এটি সম্পর্কে অন্যান্য থ্রেড রয়েছে তবে সত্যিকার অর্থে কেউই স্পষ্ট পার্থক্য উল্লেখ করেনি যা কোনও বিকাশকারীকে সহজেই সিদ্ধান্ত নিতে সহায়তা করে যে তিনি প্রকৃত সমস্যার জন্য এক বা অন্যটি ব্যবহার করা ভাল কিনা if)

উত্তর:


272

কিছু ক্ষেত্রে এটি একটি AsyncTaskবা অন্যগুলির দ্বারা একই কাজটি সম্পাদন করা সম্ভব হয় Serviceতবে সাধারণত একটির সাথে অন্য কাজের তুলনায় আরও উপযুক্ত।

AsyncTaskগুলিগুলি একবারে অফ-সময় ব্যয়কারী কাজের জন্য ডিজাইন করা হয়েছে যা ইউআই থ্রেডটি চালানো যায় না। একটি সাধারণ উদাহরণ হ'ল বাটন টিপে যখন ডেটা আনা / প্রক্রিয়াজাতকরণ।

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

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

শেরিফ যেমন ইতিমধ্যে বলেছে, পরিষেবাগুলি ইউআই থ্রেডের বাইরে চলে না।

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


2
এটি আকর্ষণীয় যে 2010 এ গুগল আই / ও থেকে এই আলাপে youtube.com/watch?v=xHXn3Kg2IQE উপস্থাপক একটি REST এপিআই থেকে ডেটা পাওয়ার জন্য 3 টি ভিন্ন পদ্ধতি দেয় এবং প্রথমটি কোনও পরিষেবা ব্যবহার করে। আমি কোনও অ্যান্ড্রয়েড বিশেষজ্ঞ নই তবে আমি এই ধারণার মধ্যেও ছিলাম যে কম্পিউটারিশ যা বলেছিল তা মূলত সঠিক।
উলিওং

10
সর্বশেষ অনুচ্ছেদ, "আপনার অ্যাপ্লিকেশনটির কার্যকলাপ না খোলার পরেও আপনি কোড চালাতে চান সেবার জন্য পরিষেবাগুলি"। এটি AsyncTask বা পটভূমির থ্রেডগুলির ক্ষেত্রেও। অর্থাত্ যখন আপনি আপনার ক্রিয়াকলাপটি ফিরে যান বা কল ফিনিস () এবং আপনার ক্রিয়াকলাপটি দৃশ্যমান না হয়ে থাকে তবে তবুও আপনার অ্যাপ্লিকেশন প্রক্রিয়াটিকে হত্যা না করা পর্যন্ত আপনার পটভূমির থ্রেডগুলি কার্যকর করা হয় (যেমন সাম্প্রতিক কাজগুলি থেকে অদলবদল করে)। আমি এটি 4.4.2 গুগল নেক্সাস এওএসপি
গ্রেপারের

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

দুর্দান্ত পয়েন্টস সার্ভিস সম্পর্কে দুর্দান্ত ব্যাখ্যা hat এটি হ'ল পরিষেবাটি অবিচ্ছিন্নভাবে পটভূমিতে চলছে এমনকি কাজটিও করা হচ্ছে।
বাবু কে

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

58

পরিষেবাগুলি সম্পূর্ণ আলাদা: পরিষেবাগুলি থ্রেড নয় !

আপনার ক্রিয়াকলাপ কোনও পরিষেবার সাথে আবদ্ধ হয় এবং পরিষেবাটিতে কিছু ফাংশন থাকে যা কল করার পরে কলিং থ্রেডকে অবরুদ্ধ করে। আপনার পরিষেবাটি তাপমাত্রা সেলসিয়াস থেকে ডিগ্রীতে পরিবর্তন করতে ব্যবহৃত হতে পারে। যে কোনও ক্রিয়াকলাপ বাঁধাই এই পরিষেবাটি পেতে পারে।


তবে AsyncTaskএটি একটি থ্রেড যা ব্যাকগ্রাউন্ডে কিছু কাজ করে এবং একই সাথে কলিং থ্রেডে ফলাফলগুলি রিপোর্ট করার ক্ষমতা রাখে।

কেবল একটি চিন্তা: একটি পরিষেবায় একটি AsyncTaskবিষয় থাকতে পারে !


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

1
হ্যাঁ তবে পরিষেবাগুলি কিছু করতে পারে বা নাও পারে। এগুলি দীর্ঘস্থায়ী
ওবিজেইসিটি

"একটি পরিষেবাদির একটি অ্যাসিঙ্কটাস্ক অবজেক্ট থাকতে পারে!" যে ইশারা জন্য ধন্যবাদ। তবে এটি কি ভাল ধারণা - এটি এমন কিছু যা আপনি সুপারিশ করবেন? অথবা কোনও পরিষেবাতে আরও বেসিক থ্রেডিং কৌশল ব্যবহার করা ভাল কি?
রেনিপেট

"আপনার কার্যকলাপ কোনও পরিষেবার সাথে আবদ্ধ হয়" অগত্যা।
জ্যাকসঅনএফ 1 ই

@ জ্যাকসঅনএফ 1 এর আমি জানি আমি যখন প্রথম কোডিং শুরু করলাম: p তবে "আপনার ক্রিয়াকলাপ কোনও পরিষেবার সাথে জড়িত" সত্য ঘটনাটি। আমি এই পরিষেবাতে বাধ্য হতে পারি। একটি রেফ্রিজারেটর পাশাপাশি বাঁধাই হতে পারে। এটি বিবৃতিটিকে অবৈধ করে না .. যাইহোক জে কে
শেরিফ এল খতিব

7

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

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


আপনার উত্তরটি প্রশ্নটিতে কিছু যুক্ত করে কেন আপনি তা নির্দিষ্ট করতে পারেন?
এরিকবওয়ার্ক

2
অন্যান্য উত্তরগুলি খুব ছোট বা খুব দীর্ঘ নতুনদের বোঝার জন্য। তাই আমি উদাহরণ সহ সহজ কথায় উত্তর দিয়েছি
अर्जुन

6

পরিষেবা এবং অ্যাসিনটাস্কগুলি প্রায় একই কাজ করছে, প্রায়। ব্যবহার পরিষেবা বা অ্যাসিঙ্কটাস আপনার প্রয়োজনীয়তা কী তার উপর নির্ভর করে।

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

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

শুভ কোডিং


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

3
হ্যাঁ আমি জানি উত্তরটি ইতিমধ্যে দেওয়া হয়েছে এবং আমি যদি এখানে সঠিক উত্তর বা আমার মতামত দিই তবে আমি এখানে অনেক সমস্যা দেখতে পাচ্ছি না? কারণ আপনি একমাত্র সেই ব্যক্তি নন যে একই প্রশ্নের উত্তর খুঁজছেন, যদি উপরের উত্তরে সমাধানটি বুঝতে অসুবিধা হয় তবে তিনি উপযুক্ত উত্তরটি সন্ধান করতে নিচে স্ক্রল করতে পারেন, সহজেই সেটিকে বুঝতে পারবেন। কমেন্টের জন্য ধন্যবাদ ভাই, আমি কোনও প্রতিভা বা প্রোগ্রামিংয়ের পক্ষে না, কেবল অন্যকে সাহায্য করতে চাই, অন্যকে আমি যা জানি তা শেখানোর চেষ্টা করুন :)
আশানা.জ্যাকল

1

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

উদাহরণ: আপনি যদি কোনও সঙ্গীত খেলতে চান এবং ব্যবহারকারী অ্যাপটি ছেড়ে দেয় তবে আপনি বিরতি দিতে চান না, আপনি অবশ্যই পরিষেবাটিতে যাবেন।


1

একটি তুলনা স্থানীয়, প্রক্রিয়ার মধ্যে, বেস বর্গ পরিষেবা ✱ একটি থেকে AsyncTask:

Answer (এই উত্তরটি রফতানি পরিষেবাগুলি বা ক্লায়েন্টের চেয়ে পৃথক কোনও প্রক্রিয়াতে পরিচালিত কোনও পরিষেবাকে সম্বোধন করে না, যেহেতু প্রত্যাশিত ব্যবহারের ঘটনাগুলি একটির তুলনায় যথেষ্ট আলাদা AsyncTaskAlso এছাড়াও বংশবৃদ্ধির স্বার্থে, কিছু বিশেষায়িত প্রকৃতির প্রকৃতি Serviceউপশ্রেণী (যেমন, IntentService, JobService) এখানে উপেক্ষা করা হবে।)

লাইফটাইম প্রক্রিয়া

Serviceওএসের কাছে প্রতিনিধিত্ব করে, "ব্যবহারকারীর সাথে আলাপচারিতা না করার সময় একটি অ্যাপ্লিকেশন দীর্ঘকাল ধরে চলমান অপারেশন করার ইচ্ছা" "[ রেফ ] ref

আপনার Serviceদৌড়ানোর সময়, অ্যান্ড্রয়েড বুঝতে পারে যে আপনি চান না যে আপনার প্রক্রিয়াটি হত্যা করা হোক। যখনই আপনার Activityঅনস্ক্রিন থাকে এটি এটিও সত্য এবং আপনি যখন অগ্রভাগের পরিষেবাটি চালাচ্ছেন এটি বিশেষত সত্য । (যখন আপনার সমস্ত অ্যাপ্লিকেশন উপাদানগুলি চলে যায়, অ্যান্ড্রয়েড মনে করে, "ওহ, এখন এই অ্যাপ্লিকেশনটি মেরে ফেলার জন্য ভাল সময়, সুতরাং আমি সংস্থানগুলি মুক্ত করতে পারি"))

এছাড়াও, থেকে প্রাপ্ত সর্বশেষ ফেরতের মূল্যের উপর নির্ভর করে Service.onCreate()অ্যান্ড্রয়েড রিসোর্স চাপ [ রেফ ] এর কারণে নিহত হওয়া অ্যাপস / পরিষেবাগুলিকে "পুনর্জীবিত" করার চেষ্টা করতে পারে ।

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

Multithreading

AsyncTasks কাজগুলি করার জন্য একটি ব্যাকগ্রাউন্ড থ্রেড তৈরি করা এবং তারপরে ইউআই থ্রেডের সেই কাজের ফলাফলটি থ্রেডসেফ পদ্ধতিতে উপস্থাপন করা।

প্রতিটি নতুন AsyncTaskসম্পাদনের ফলে AsyncTasks'sথ্রেড-পুল [ রেফ ] এর সীমাবদ্ধতার সাপেক্ষে আরও সংহত (আরও থ্রেড) ফলাফল হয় ।

Serviceঅন্যদিকে, পদ্ধতিগুলি সর্বদা ইউআই থ্রেডে থাকে [ রেফ ]। এই ক্ষেত্রে প্রযোজ্য onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), ইত্যাদি সুতরাং, কিছু অর্থে, Servicesনা "রান" পটভূমিতে না। একবার তারা ( onCreate()) শুরু করার পরে , তারা কেবল সেখানে "বসতে" শুরু করবে - যতক্ষণ না এটি পরিষ্কার করার, কোনও প্রয়োগ করার সময় হয় onStartCommand()etc.

অন্য কথায়, অতিরিক্ত যোগ করার Servicesফলে আরও সম্মতি হয় না। প্রচুর পরিমাণে কাজ করার জন্য পরিষেবা পদ্ধতিগুলি ভাল জায়গা নয়, কারণ তারা ইউআই থ্রেডে চলে

অবশ্যই, আপনি প্রসারিত করতে পারেন Service, আপনার নিজস্ব পদ্ধতি যুক্ত করতে পারেন এবং যে কোনও থ্রেড থেকে তাদের কল করতে পারেন। তবে আপনি যদি এটি করেন তবে থ্রেড সুরক্ষার জন্য দায়বদ্ধতা আপনার কাঠামোর নয়।

আপনি যদি নিজের কোনও পটভূমি থ্রেড (বা অন্য কোনও ধরণের কর্মী) যুক্ত করতে চান তবে আপনি তা করতে নির্দ্বিধায় Service। উদাহরণস্বরূপ আপনি একটি পটভূমি থ্রেড / AsyncTaskইন শুরু করতে পারেন Service.onCreate()। তবে সমস্ত ব্যবহারের ক্ষেত্রে এটির প্রয়োজন হয় না। উদাহরণ স্বরূপ:

  • আপনি হয়ত Serviceদৌড়াতে চাইবেন যাতে আপনি "ব্যাকগ্রাউন্ড" এ অবস্থান আপডেটগুলি অবিরত রাখতে পারেন (অর্থাত্ কোনও Activitiesঅনস্ক্রিন না করেই )।
  • অথবা, আপনি কেবল আপনার অ্যাপটি জীবিত রাখতে চাইতে পারেন যাতে আপনি BroadcastReceiverএকটি দীর্ঘমেয়াদী ভিত্তিতে একটি "অন্তর্নিহিত" নিবন্ধিত রাখতে পারেন (এপিআই 26 এর পরে, আপনি সর্বদা ম্যানিফেস্টের মাধ্যমে এটি করতে পারবেন না, সুতরাং আপনাকে পরিবর্তে রানটাইমে রেজিস্ট্রেশন করতে হবে [ রেফ ]]।

এই ব্যবহারের ক্ষেত্রে কোনওটিই সিপিইউ ক্রিয়াকলাপের একটি দুর্দান্ত চুক্তির প্রয়োজন হয় না; তাদের কেবলমাত্র অ্যাপ্লিকেশনটি হত্যা করা উচিত নয়

শ্রমিক হিসাবে

Servicesটাস্ক-ভিত্তিক নয়। এগুলি যেমন "কোনও কার্য সম্পাদন" এবং "ফলাফল সরবরাহ" করতে সেট আপ করা হয় না AsyncTasksServicesকোনও থ্রেড-সুরক্ষা সমস্যা সমাধান করবেন না (তবুও যে সমস্ত পদ্ধতি একত থ্রেডে কার্যকর করা হয়)। AsyncTasksঅন্যদিকে, আপনার জন্য সেই জটিলতাটি পরিচালনা করুন।

লক্ষ্য করুন AsyncTaskহয় উঠিয়ে দেওয়ার কাল । তবে এর অর্থ এই নয় যে আপনার AsyncTasksসাথে আপনার প্রতিস্থাপন করা উচিত Services! (আপনি যদি এই উত্তরটি থেকে কিছু শিখে থাকেন তবে তা অনেকটা পরিষ্কার হওয়া উচিত))

টি এল; ডিআর

Servicesবেশিরভাগ সেখানে "অস্তিত্ব" আছে। এগুলি অফ-স্ক্রিনের মতো Activity, অ্যাপ্লিকেশনটির বেঁচে থাকার কারণ সরবরাহ করে, অন্য উপাদানগুলি "কাজ" করার ক্ষেত্রে যত্ন নেয়। AsyncTasks"কাজ" করুন তবে তারা এবং তাদের মধ্যে কোনও প্রক্রিয়া বাঁচিয়ে রাখবে না।

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