অ্যান্ড্রয়েড - ক্রিয়াকলাপের নির্মাণকারীর বনাম অনক্রিট re


89

আমি বুঝতে পারি যে অ্যান্ড্রয়েডের Activitiesনির্দিষ্ট লাইফসাইকেল রয়েছে এবং সেটি onCreateওভাররাইড করা উচিত এবং প্রারম্ভিককরণের জন্য ব্যবহার করা উচিত তবে কনস্ট্রাক্টরে ঠিক কী ঘটে? আপনি কি সেই সাথে Activityকনস্ট্রাক্টরকে ওভাররাইড করতে পারেন এমন কোনও পরিস্থিতি রয়েছে , বা আপনার কখনই এটি স্পর্শ করা উচিত নয়?

আমি ধরে নিচ্ছি যে কনস্ট্রাক্টরটি কখনই ব্যবহার করা উচিত নয় কারণ উল্লেখগুলি Activitiesপুরোপুরি পরিষ্কার করা হয় না (এইভাবে আবর্জনা সংগ্রহকারীকে বাধাগ্রস্ত করে) এবং এটি onDestroyসেই উদ্দেশ্যেই রয়েছে। এটা কি সঠিক?


4
অ্যান্ড্রয়েড যে কোনও সময় আপনার ক্রিয়াকলাপ ধ্বংস / পুনরায় তৈরি করতে পারে এই সম্পর্কে কী? আপনি জানেন না যে কনস্ট্রাক্টরকে তখন ডাকা হবে কিনা এবং এমনকি - কোন কনস্ট্রাক্টরকে ডাকা হবে ... (এটি একই টুকরাগুলিতে প্রযোজ্য এবং এ কারণেই প্রতিটি খণ্ডকে খালি ডিফল্ট কনস্ট্রাক্টর প্রয়োগ করতে হবে)।
মারিয়ান প্যাডজিওচ

উত্তর:


34

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


75
onCreate () আপনাকে চূড়ান্ত ক্ষেত্রগুলি ব্যবহার করতে বাধা দেয়।
গিলি

4
তবে অনক্রিটকে একবার ফোন করা হয় না, আমি কি ভুল করছি? আমি যখন স্ক্রিন ওরিয়েন্টেশন পরিবর্তন করি এবং আমার হাত দিয়ে ফিরে আসি, ততবারই ক্রিয়াকলাপটি পুনরায় লোড হয়ে যায়, অনক্রিটকে বলা হয়
ফ্রেসিস

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

কখন অনক্রিয়েট ইভেন্টটি ঠিক চলতে শুরু করবে? আমি যখন অনক্রিয়েট ইভেন্টের শুরুতে একটি ব্রেকপয়েন্ট সেট করি তাই অ্যাপ রান করে এবং স্ক্রিনে ক্রিয়াকলাপ লোড করে তারপরে ব্রেকপয়েন্টটি সক্রিয় হয় এবং অ্যাপটি বিরতিতে যায়। আমার ক্রিয়াকলাপ সম্পর্কে একটি ইভেন্ট দরকার যা ক্রিয়াকলাপটি আরম্ভ এবং চালু হওয়ার ঠিক আগে সক্রিয় হয়।
মোহাম্মদ আফরাশতেহ

@ চেরিল সাইমন, আপনি বলেছিলেন যে আপনি কখনই সরাসরি কোনও ক্রিয়াকলাপ তৈরি করেন না, তবে এই কার্যকলাপটি কে তৈরি করে?
শ্রীকান্ত করুণাঘাট

7

গিলির মন্তব্যে যেমন কনস্ট্রাক্টরকে জিনিস রাখার একটা ভাল কারণ হ'ল চূড়ান্ত ক্ষেত্র ব্যবহার।

যাইহোক, আপনি যদি কনস্ট্রাক্টরের জিনিসগুলিকে আরম্ভ করেন, তবে অবজেক্টটির জীবনকাল খানিকটা দীর্ঘ হবে, যদিও আমি onCreateখুব বেশি চিন্তা করি না কারণ এরপরেই ডাকা হবে।

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

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

যাইহোক, আপনি যদি সদস্যদের দিকে তাকান তবে আপনি সম্ভবত আরম্ভ করছিলেন

  • তাদের একটি "নিকট" পদ্ধতি থাকবে যা আপনাকে সঠিক সময়ে প্রার্থনা করতে হবে (অনারিউম বা অনপেজ)

  • তারা সেই দৃশ্যের অংশ হবেন যার অর্থ এটি আরম্ভ করা দরকার তারপর অনক্রিটকে কল করা দরকার

  • তারা ধ্রুবক যা কোনওভাবেই কনস্ট্রাক্টরে রাখার দরকার নেই, কেবল একটি স্ট্যাটিক ফাইনাল করবে। এর মধ্যে পেইন্ট এবং পাথ ধ্রুবকগুলি রয়েছে যা স্ট্যাটিক ব্লক দ্বারা সূচনা করা যেতে পারে


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

4
রিচিএইচএইচ আর লম্বা আর্কিমিডিস ঠিকই বলেছেন যে কনস্ট্রাক্টর অনক্রিয়েট () এর আগে ডাকা হবে এবং তাই সেখানে যা কিছু করা হবে ততক্ষণ ক্রিয়াকলাপটি ধ্বংস হওয়ার চেয়ে বেশি সময় ধরে চলতে থাকবে
ph7979

6

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

দুটি কথায়, কনস্ট্রাক্টর আপনাকে একটি "মাস্টার্যাকটিভিটি" অনুকরণ করে যা উত্তরাধিকারসূত্রে পুনরায় ব্যবহার করা যায়!


15
আমি জানি এটি পুরানো তবে এটি অনক্রিট () এ কেবলমাত্র সুপার ফিল্ড ইনস্ট্যান্টেশন প্রয়োগের মাধ্যমে এখানে কী লাভ। আপনি যেভাবেই হোক বাচ্চা থেকে সুপার.অনক্রিট () কল করবেন।
অ্যান্ড্রু জি

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

0

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


4
আপনি এই আরও বিস্তারিত বলতে পারেন? আপনি যা বর্ণনা করেছেন তা আকর্ষণীয় মনে হলেও এটি কিছুটা অস্পষ্ট। ধন্যবাদ!
ভক্তি

4
মনে করুন আপনার একটি কাস্টম ক্রিয়াকলাপ তৈরি করতে হবে যা 2 বা ততোধিক প্যারাম নেয়। আপনার কেবল কনস্ট্রাক্টর ব্যবহার করা দরকার, আপনি ওনক্রিট এবং অতিরিক্তগুলি দিয়ে এটি করতে পারবেন না। এটি সাহায্য করে?
পেন্টিয়াম

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

6
আমি বলতে যাচ্ছি, এটি আমাকে @ পেন্টিয়ামের কাছে বোঝায় না, কোডের উদাহরণ ছাড়াই নয়।
ব্লুন্ডেল

আমি মনে করি কনস্ট্রাক্টরের মাধ্যমে জিনিসগুলি করার একটি সুবিধা হ'ল একটি "টেমপ্লেট" ক্রিয়াকলাপ যা কোনও উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণিটি যে প্যারামিটারগুলি নিতে পারে সেগুলি নিতে পারে। উদাহরণস্বরূপ, যদি আপনার দুটি ক্রিয়াকলাপ থাকে যা কেবলমাত্র কিছু বৈশিষ্ট্যের মধ্যে পৃথক হয় যেমন R.id.cameraSurface, R.id.videoSurface তবে আপনি এমন একটি কনস্ট্রাক্টর তৈরি করতে পারেন যা প্যারামিটারে এটি AbstractResourceActivity কল করবে এবং তারপরে আপনার ক্যামেরাঅ্যাক্টিভিটি রয়েছে যা নিবন্ধিত রয়েছে ম্যানিফেস্টে যা সংস্থান আইডিতে উত্তরণ অ্যাস্ট্রাক্টর রিসোর্সঅ্যাক্টিভিটি প্রসারিত করে।
আর্কিমিডিজ ট্রাজানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.