দীর্ঘ চলমান ক্রিয়াকলাপগুলির জন্য Android AsyncTask


91

এখানে পাওয়া অ্যাসিঙ্কটাস্কের ডকুমেন্টেশনের উদ্ধৃতি দিয়ে বলা হয়েছে:

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

এখন আমার প্রশ্ন উঠছে: কেন? doInBackground()ফাংশন রান UI 'তে থ্রেড বন্ধ তাই কি ক্ষতি এখানে একটি দীর্ঘ চলমান অপারেশন না থাকার রয়েছে?


4
একটি আসল ডিভাইসে কোনও অ্যাপ্লিকেশন (যে asyncTask ব্যবহার করে) স্থাপন করার সময় আমি যে সমস্যার মুখোমুখি হয়েছি doInBackgroundতা হ'ল প্রগতি বারটি ব্যবহার না করা থাকলে দীর্ঘকাল ধরে চলমান ফাংশনটি স্ক্রিনকে হিমিয়ে তোলে ।
ভেঙ্কটকা

4
যেহেতু একটি অ্যাসিঙ্কটাস্ক এটি চালু হওয়া ক্রিয়াকলাপের সাথে আবদ্ধ So সুতরাং যদি কার্যকলাপটি নিহত হয় তবে আপনার অ্যাসিঙ্কটাস্ক উদাহরণটিও মারা যেতে পারে।
ইগোরগানাপলস্কি

যদি আমি কোনও পরিষেবার মধ্যে অ্যাসিঙ্কটাস্ক তৈরি করি তবে কী হবে? তাতে কি সমস্যার সমাধান হবে না?
এডি

4
পটভূমিতে দীর্ঘ ক্রিয়াকলাপ চালানোর জন্য ইনটেন্ট সার্ভিস, নিখুঁত সমাধান ব্যবহার করুন।
কিউর থুমার

উত্তর:


121

এটি একটি খুব ভাল প্রশ্ন, ইস্যুটি পুরোপুরি বোঝার জন্য অ্যান্ড্রয়েড প্রোগ্রামার হিসাবে সময় লাগে। প্রকৃতপক্ষে অ্যাসিঙ্কটাসকের দুটি প্রধান সমস্যা সম্পর্কিত যা সম্পর্কিত:

  • এগুলি ক্রিয়াকলাপের জীবনচক্রের সাথে খারাপভাবে আবদ্ধ
  • তারা খুব সহজেই মেমরি ফাঁস তৈরি করে।

ইনসাইড RoboSpice (প্রেরণাগুলি অ্যাপ্লিকেশন Google Play তে প্রাপ্তিসাধ্য ) আমরা বিস্তারিতভাবে এই প্রশ্নের উত্তর। এটি AsyncTasks, লোডারগুলি, তাদের বৈশিষ্ট্যগুলি এবং অসুবিধাগুলির একটি গভীরতর দর্শন দেবে এবং আপনাকে নেটওয়ার্ক অনুরোধগুলির বিকল্প সমাধানের সাথে পরিচয় করিয়ে দেবে: রোবস্পাইস। নেটওয়ার্ক অনুরোধগুলি অ্যান্ড্রয়েডে একটি সাধারণ প্রয়োজন এবং প্রকৃতির দীর্ঘায়িত ক্রিয়াকলাপ। অ্যাপ্লিকেশনটির একটি অংশ এখানে দেওয়া হয়েছে:

অ্যাসিঙ্কটাস্ক এবং ক্রিয়াকলাপের জীবন চক্র

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

এবং এটি শেষ হলে, অ্যাসিঙ্কটাস্ক নতুন ক্রিয়াকলাপের UI আপডেট করবে না। প্রকৃতপক্ষে এটি ক্রিয়াকলাপের পূর্ববর্তী উদাহরণটি আপডেট করে যা আর প্রদর্শিত হয় না। এটি java.lang.IllegalArgumentException টাইপটির ব্যতিক্রম হতে পারে: যদি আপনি ক্রিয়াকলাপের ভিতরে কোনও ভিউ পুনরুদ্ধার করতে উইন্ডো ম্যানেজারের সাথে সংযুক্ত না হন তবে দেখুন find

স্মৃতি ফাঁস ইস্যু

আপনার ক্রিয়াকলাপের অভ্যন্তরীণ ক্লাস হিসাবে অ্যাসিঙ্কটাস্ক তৈরি করা খুব সুবিধাজনক। অ্যাসিঙ্কটাস্ককে যখন কার্য সম্পূর্ণ হয় বা অগ্রগতি হয় তখন ক্রিয়াকলাপের দৃষ্টিভঙ্গিগুলি পরিচালনা করতে হবে, ক্রিয়াকলাপের অভ্যন্তরীণ শ্রেণিটি ব্যবহার করা সুবিধাজনক বলে মনে হয়: অভ্যন্তরীণ শ্রেণীগুলি বাইরের শ্রেণীর যে কোনও ক্ষেত্রে সরাসরি অ্যাক্সেস করতে পারে।

তবুও, এর অর্থ এই যে অভ্যন্তরীণ শ্রেণি তার বহিরাগত শ্রেণীর উদাহরণের উপরে একটি অদৃশ্য রেফারেন্স রাখবে: ক্রিয়াকলাপ।

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


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

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


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

কী ঘটে তা দেখতে ট্রেস করুন। তবে হ্যাঁ, এটা বেশ সম্ভব! আপনি যদি আপনার অ্যাসিনটাস্কটি ভালভাবে বর্ণনা করেন তবে আপনি এটির পরিবর্তে এটি সঠিকভাবে বাতিল করতে পারেন, আপনি আরএস বা কোনও পরিষেবায় মাইগ্রেট করতে না চাইলে এটি একটি ভাল
সূচনার পয়েন্ট হবে

@ স্নিকোলস জবাবের জন্য ধন্যবাদ। আমি গতকাল এসওতে আমার সমস্যার রূপরেখা প্রকাশ করে এবং 8 সেকেন্ডের পরে অ্যাসিঙ্কটাস্ক বন্ধ করার চেষ্টা করার জন্য যে হ্যান্ডলার কোডটি লিখেছি তা দেখিয়েছিলাম। সময় পেলে কি একটু খেয়াল করবেন? কোনও হ্যান্ডলারের কাছ থেকে AsyncTask.cancel (সত্য) কল করা কি সঠিকভাবে কার্য বাতিল করবে? আমি জানি আমার পর্যায়ক্রমে আমার doInBackgroud এ iscancelled () এর মান পরীক্ষা করা উচিত, তবে আমি মনে করি না যে আমার পরিস্থিতি প্রযোজ্য কারণ আমি কেবলমাত্র একটি লাইন ওয়েবক্লাল এইচটিপিপস্ট করছি এবং ইউআই-তে আপডেট প্রকাশ করছি না Asএইসিএনটাস্কের বিকল্প আছে উদাহরণস্বরূপ, কোনও ইনট্যান্স সার্ভিস থেকে এইচটিপি পোস্ট করা সম্ভব
টার্টলবয়

এখানে লিঙ্ক stackoverflow.com/questions/17725767/...
turtleboy

আপনার রোবস্পাইসে চেষ্টা করা উচিত (গিথুব অন)। ;)
Snicolas

38

কেন?

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

বিশেষত, অ্যান্ড্রয়েড 2.২ দিয়ে শুরু করে, AsyncTaskডিফল্টরূপে ব্যবহৃত থ্রেড পুলের ( android:targetSdkVersion১৩ বা তার বেশি সেটযুক্ত অ্যাপ্লিকেশনগুলির জন্য ) এতে কেবল একটি থ্রেড রয়েছে - আপনি যদি এই থ্রেডটিকে অনির্দিষ্ট সময়ের জন্য বেঁধে রাখেন তবে আপনার অন্য কোনও কাজ চলবে না।


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

আমি যদি কোনও পরিষেবার ভিতরে এসিঙ্কটাস্ক শুরু করি তাও কি একই ?? মানে দীর্ঘকাল ধরে চলমান অপারেশনটি কি এখনও সমস্যা হবে?
এডি

4
@ অ্যাডি: হ্যাঁ, এটি থ্রেড পুলের প্রকৃতি পরিবর্তন করে না। একটির জন্য Service, কেবল একটি Threadবা একটি ব্যবহার করুন ThreadPoolExecutor
কমন্সওয়্যার

আপনাকে ধন্যবাদ @ কমন্সওয়্যার ঠিক শেষ প্রশ্ন, টাইমারটাস্ক কি অ্যাসিঙ্কটাসকের একই অসুবিধাগুলি ভাগ করে দেয়? নাকি এটি সম্পূর্ণ আলাদা জিনিস?
এডি

4
@ অ্যাডি: TimerTaskস্ট্যান্ডার্ড জাভা থেকে, অ্যান্ড্রয়েড নয়। TimerTaskমূলত ScheduledExecutorService(যার নাম সত্ত্বেও, এটি স্ট্যান্ডার্ড জাভার অংশ হিসাবে) পক্ষে চলে গেছে। উভয়ই অ্যান্ড্রয়েডের সাথে আবদ্ধ নয় এবং তাই আপনার যদি এখনও সেই পরিষেবাটির প্রয়োজন হয় যদি আপনি ব্যাকগ্রাউন্ডে চালিত হওয়ার প্রত্যাশা করেন। এবং, আপনার অ্যান্ড্রয়েড থেকে সত্যই বিবেচনা করা উচিত AlarmManager, সুতরাং আপনার কেবল ঘড়ির টিক দেখার জন্য কোনও পরিষেবা ঝুলতে হবে না।
কমন্সওয়্যার

4

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

দীর্ঘস্থায়ী কর্মের জন্য, যার জন্য ইউআই আপডেটের প্রয়োজন হয় না, আপনি পরিবর্তে পরিষেবাগুলি ব্যবহার করতে পারেন কারণ তারা ইউআই ছাড়াই বাঁচতে পারে।

সুতরাং সংক্ষিপ্ত কার্যগুলির জন্য, অ্যাসিঙ্ক টাস্কগুলি ব্যবহার করুন কারণ তারা আপনার ক্রিয়াকলাপ ক্রিয়াকলাপটি মারা যাওয়ার পরে ওএস দ্বারা মারা যেতে পারে (সাধারণত মিড-অপারেশনটি মারা যায় না তবে এটি কার্য সম্পাদন করে)। এবং দীর্ঘ এবং পুনরাবৃত্তিমূলক কাজের জন্য পরিবর্তে পরিষেবাগুলি ব্যবহার করুন।

আরও তথ্যের জন্য, থ্রেড দেখুন:

অ্যাসিঙ্কটাস্ক কয়েক সেকেন্ডের চেয়ে বেশি সময় ধরে?

এবং

ক্রিয়াকলাপটি ধ্বংস হয়ে গেলেও অ্যাসিঙ্কটাস্ক থামবে না


1

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

এটির সমাধানের সমাধান হ'ল অ্যাসিঙ্ক টাস্কটিকে ক্রিয়াকলাপের স্থিতিশীল অভ্যন্তর শ্রেণি হিসাবে সংজ্ঞায়িত করা হয় এবং প্রসঙ্গে দুর্বল রেফারেন্স ব্যবহার করা হয়।

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

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