অ্যান্ড্রয়েড স্ট্যাটিক অবজেক্ট লাইফসাইকেল


101

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

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

তবে আমি ভয় পাই যদি অ্যান্ড্রয়েডে স্থির অবজেক্টের জীবনচক্র সম্পর্কে যদি কম স্মৃতি পাওয়া যায় তবে অ্যান্ড্রয়েড স্থির বস্তুগুলি মুছবে ???

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

উত্তর:


238

কিছুটা পটভূমি দিয়ে শুরু করা যাক: আপনি যখন অ্যাপ্লিকেশন শুরু করবেন তখন কী ঘটে?
ওএস একটি প্রক্রিয়া শুরু করে এবং এটিকে একটি অনন্য প্রক্রিয়া আইডি নির্ধারণ করে এবং একটি প্রক্রিয়া টেবিল বরাদ্দ করে A একটি প্রক্রিয়া ডিভিএম (ডালভিক ভিএম) এর উদাহরণ শুরু করে; প্রতিটি অ্যাপ্লিকেশন একটি ডিভিএমের মধ্যে চলে।
একটি ডিভিএম ক্লাস লোডিং আনলোডিং, ইনস্ট্যান্স লাইফসাইকেল, জিসি ইত্যাদি পরিচালনা করে

স্ট্যাটিক ভেরিয়েবলের লাইফটাইম: একটি স্ট্যাটিক ভেরিয়েবল অস্তিত্ব লাভ করে যখন কোনও শ্রেণি জেভিএম দ্বারা লোড হয় এবং শ্রেণিটি লোড না করা অবস্থায় মারা যায়।

সুতরাং যদি আপনি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করেন এবং একটি স্ট্যাটিক ভেরিয়েবল শুরু করেন, তবে নিম্নলিখিতটিগুলির একটি না হওয়া পর্যন্ত এটি JVM এ থাকবে:
1. শ্রেণিটি লোড করা হয় না
the JVM বন্ধ হয়ে
যায় the. প্রক্রিয়াটি মারা যায়

নোট করুন যে আপনি যখন অন্য কোনও অ্যাপ্লিকেশনের ভিন্ন ক্রিয়ায় স্যুইচ করেন এবং উপরের তিনটির কোনওটিই ঘটে না তখন স্থিতিশীল ভেরিয়েবলের মান বজায় থাকবে। উপরোক্ত তিনটির মধ্যে যে কোনওটি ঘটলে স্থির তার মান হারাবে।

আপনি কয়েকটি লাইনের কোড দিয়ে এটি পরীক্ষা করতে পারেন:

  1. আপনার ক্রিয়াকলাপের অনক্রিটে অবিচ্ছিন্ন স্ট্যাটিকটি মুদ্রণ করুন -> নাল মুদ্রণ করা উচিত
  2. স্থির সূচনা। এটি মুদ্রণ করুন -> মানটি নাল নয়
  3. পিছনের বোতামটি হিট করুন এবং হোম স্ক্রিনে যান। দ্রষ্টব্য: হোম স্ক্রিন অন্য ক্রিয়াকলাপ।
  4. আপনার ক্রিয়াকলাপটি আবার চালু করুন -> স্ট্যাটিক ভেরিয়েবল অকার্যকর হবে
  5. ডিডিএমএস থেকে আপনার অ্যাপ্লিকেশন প্রক্রিয়াটি হত্যা করুন (ডিভাইসগুলির উইন্ডোতে স্টপ বোতাম)।
  6. আপনার ক্রিয়াকলাপটি পুনঃসূচনা করুন -> স্ট্যাটিকের নাল মান হবে।

আশা করি এইটি কাজ করবে.


1
আমি জানতে চাই যে আমি যখন নতুন ক্রিয়াকলাপ শুরু করি তখন কেন স্থির হয় না যদি আমি অ্যাপ্লিকেশন অবজেক্টে আমার ক্ষেত্রের মান হ্রাস করি উদাহরণস্বরূপ আমি অ্যাপ্লিকেশন অবজেক্টে ভেরিয়েবল বর্তমান পৃষ্ঠাটি ঘোষণা করি এবং আমি যখন নতুন ক্রিয়াকলাপ খুলি তখন এর মান সর্বদা শূন্যে ফিরে আসে
মোহাম্মদ সুহি শেখ কুরোশ

যখন আমি সুপার.অনরেস্টোরআইনস্ট্যান্সস্টেট (সেভডআইনস্ট্যান্সস্টেট) কল করি; আমি স্থির হয়ে উঠলেও আমার পরিবর্তনশীল হারাব, সমস্যা কি?
মোহাম্মদ সুহি শেখ কুরূশ

1
এটি একটি দুর্দান্ত ব্যাখ্যা (সুতরাং -1) তবে এটি কিছুটা অপ্রয়োজনীয়: ওপি স্পষ্টভাবে "কম স্মৃতি পরিস্থিতি" (কেন আমি এখানে এসেছি) সম্পর্কে জিজ্ঞাসাবাদ করেছিল, যেখানে আমি জানি যতদূর ওএস ভিএমকে হত্যা করতে পারে এবং এটি একই প্যারামিটারগুলির সাথে পরে পুনরায় আরম্ভ করুন, এবং এই
কেসটি

1
@ সুটিয়ানশি আমি মনে করি আমরা অ্যাপ্লিকেশন.অনক্রিয়েটে স্থির দৃষ্টান্তগুলিকে সূচনা করতে পারি, কারণ আমাদের অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে চলে গেলেও এবং প্রক্রিয়াটি মারা যায়, আমাদের অ্যাপ্লিকেশনটিতে ফিরে যাওয়ার সাথে সাথে অ্যাপ্লিকেশন ক্লাসটি তাত্ক্ষণিকভাবে উপস্থাপিত হবে এবং তার সাথে সম্পর্কিত লাইফাসাইক্যাল পদ্ধতিগুলি কল করবে আবার! যদিও এ সম্পর্কে আমার কাছে কনফার্মেশন দরকার, আমি অবাক হয়েছি যদি এমন কোন দৃশ্যপট থাকতে পারে যেখানে অ্যাপ্লিকেশন-এ স্ট্যাটিক উদাহরণটি আরম্ভ করা হয়েছিল C
সার্থক মিত্তাল

1
আমি এখানে যা অনুপস্থিত তা "1 ক্লাসটি লোড করা" এর ব্যাখ্যা for কখন এটি ঘটবে? JVM কোনও ক্লাস মেমোরিতে কম থাকলে তা আনলোড করবে?
stoefln

16

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

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

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


6

কিছু গবেষণার পরে, দেখা যাচ্ছে যে সিলেটলেট সংরক্ষণের জন্য অ্যাপ্লিকেশন ব্যবহার করা কোনও ধারণার মতো দুর্দান্ত নয়, আপনি যদি তা পুনরায় তৈরি করতে প্রস্তুত না হন:

অ্যাপ্লিকেশন অবজেক্টে ডেটা সংরক্ষণ করবেন না

সুতরাং গৃহীত উত্তরটি প্রযুক্তিগতভাবে সঠিক হলেও এটি সমস্ত তথ্য সরবরাহ করে না।

উপরের লিঙ্কটি যেমন বোঝায় যে, আপনি যদি সত্যিই সেই মডেলটির সাথে আঁকতে চান তবে আপনার যদি সম্ভব হয় তবে নালটি পরীক্ষা করার জন্য এবং প্রস্তুত করা দরকার be


3

@ r1k0 এখানে ঠিক আছে। কোনও শ্রেণীর স্ট্যাটিক ক্ষেত্রগুলিতে ডেটা সঞ্চয় করা অ্যাপ্লিকেশন প্রক্রিয়া হত্যা এবং পুনঃসূচনাগুলি জুড়ে তার নিজের উপর স্থির থাকবে না। অ্যান্ড্রয়েড যখন মেমরির প্রয়োজন হয় তখন নিয়মিতভাবে প্রক্রিয়াগুলি (চলমান অ্যাপ্লিকেশনগুলি) হত্যা করে।

অ্যান্ড্রয়েড ডক হিসাবে: ক্রিয়াকলাপের অবস্থা এবং মেমরি থেকে নির্গমন ,

সিস্টেম কখনই সরাসরি কোনও ক্রিয়াকলাপ হত্যা করে না। পরিবর্তে, এটি ক্রিয়াকলাপটি চালায় এমন প্রক্রিয়াটিকে হত্যা করে যা কেবল ক্রিয়াকলাপই নয়, প্রক্রিয়াটিতে চলমান অন্য সমস্ত কিছুকেও ধ্বংস করে দেয়।

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

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

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

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