অ্যান্ড্রয়েডে অ্যাপ্লিকেশন প্রসঙ্গে সিঙ্গলেটস?


362

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

উভয় পদ্ধতিতে কী কী সুবিধা / ত্রুটি থাকতে পারে?

সত্যি কথা বলতে, আমি ওয়েব পোস্টের সাথে এই পোস্টে সিঙ্গেলটন প্যাটার্নে একই উত্তরটি আশা করি , ভাল ধারণা নয়! তবে অ্যান্ড্রয়েডে প্রয়োগ হয়েছে। আমি কি সঠিক? ডালভিকভিমে অন্যথায় কী আলাদা?

সম্পাদনা: আমি জড়িত বিভিন্ন দিক সম্পর্কে মতামত পেতে চাই:

  • সিংক্রোনাইজ
  • পুনর্ব্যাবহার্যোগ্যতা
  • পরীক্ষামূলক

উত্তর:


295

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

সিঙ্গলেটনগুলি পরীক্ষার জন্য দুঃস্বপ্ন এবং যদি অলসভাবে শুরু করা হয় তবে সূক্ষ্ম পার্শ্ব প্রতিক্রিয়াগুলির সাথে "রাষ্ট্রবিরোধবাদ" প্রবর্তন করবে (যা হঠাৎ পৃষ্ঠ getInstance()থেকে অন্য দিকে যেতে যেতে কল হতে পারে)। দৃশ্যমানতাটিকে অন্য একটি সমস্যা হিসাবে উল্লেখ করা হয়েছে এবং যেহেতু সিলেটলেটগুলি "গ্লোবাল" (= এলোমেলো) ভাগ করে নেওয়া অবস্থায় অ্যাক্সেস বোঝায় , তখন সহবর্তী অ্যাপ্লিকেশনগুলিতে সঠিকভাবে সুসংগত না হলে সূক্ষ্ম বাগগুলি দেখা দিতে পারে arise

আমি এটিকে একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করি, এটি একটি খারাপ অবজেক্ট-ভিত্তিক স্টাইল যা মূলত বৈশ্বিক রাষ্ট্র বজায় রাখার সমান।

আপনার প্রশ্নে ফিরে আসতে:

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


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

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

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

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

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

231

আমি খুব বেশি সিঙ্গেলনের প্রস্তাব দিই। আপনার যদি একটি সিঙ্গেলটন থাকে যার প্রসঙ্গে প্রয়োজন হয়:

MySingleton.getInstance(Context c) {
    //
    // ... needing to create ...
    sInstance = new MySingleton(c.getApplicationContext());
}

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

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

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

আপনি যা করছেন সে সম্পর্কে কেবল চিন্তাশীল হন। :)


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

2
বাহ্যিক ইভেন্টের জন্য নয় - ব্রডকাস্টারসিভার.অনরসিপ () কেও মূল থ্রেডে ডাকা হয়।
হ্যাকবড

2
ঠিক আছে. আপনি কি আমাকে এমন কিছু পাঠ্য উপাদানের দিকে ইঙ্গিত করবেন (আমি কোডটি পছন্দ করব) যেখানে আমি মূল থ্রেড প্রেরণ পদ্ধতিটি দেখতে পারি? আমি মনে করি এটি আমার জন্য একবারে বেশ কয়েকটি ধারণা স্পষ্ট করে দেবে। আগাম ধন্যবাদ.
মিসচোনকার

2
এটি মূল অ্যাপ্লিকেশন-প্রেরণকারী কোড: android.git.kernel.org/?p=platform/frameworks/…
হ্যাকবড

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

22

থেকে: বিকাশকারী> রেফারেন্স - অ্যাপ্লিকেশন

সাধারণত সাবক্লাস অ্যাপ্লিকেশন প্রয়োজন হয় না। বেশিরভাগ পরিস্থিতিতে স্থিতিশীল সিঙ্গলেটগুলি আরও কার্যকরভাবে একই কার্যকারিতা সরবরাহ করতে পারে। যদি আপনার সিঙ্গলটনের কোনও বৈশ্বিক প্রসঙ্গের প্রয়োজন হয় (উদাহরণস্বরূপ ব্রডকাস্ট রিসিভারগুলি নিবন্ধ করার জন্য), এটি পুনরুদ্ধার করার জন্য ফাংশনটি এমন একটি প্রবন্ধ দেওয়া যেতে পারে যা সিঙ্গলটন নির্মাণের সময় অভ্যন্তরীণভাবে Context.get ApplicationContext () ব্যবহার করে।


1
এবং যদি আপনি সিঙ্গলটনের জন্য একটি ইন্টারফেস লেখেন, getInstance অ-স্থিতিশীল রেখে, আপনি এমনকি সিঙ্গলটন-ব্যবহারকারী শ্রেণীর ডিফল্ট কনস্ট্রাক্টর একটি নন-ডিফল্ট কনস্ট্রাক্টরের মাধ্যমে প্রোডাকশন সিঙ্গেলটন ইনজেকশন করতে পারেন, এটি সেই নির্মাণকারীরও যা আপনি ক্রাইটিংয়ের জন্য ব্যবহার করেন একক-ব্যবহারের ক্লাসটি তার ইউনিট পরীক্ষায়।
android.weasel

11

অ্যাপ্লিকেশনটি সিঙ্গলটনের মতো নয় reasons কারণগুলি হ'ল:

  1. অ্যাপ্লিকেশনটির পদ্ধতি (যেমন অনক্রিয়েট) কে ইউআই থ্রেডে ডাকা হয়;
  2. সিঙ্গলটনের পদ্ধতিটি যে কোনও থ্রেডে কল করা যেতে পারে;
  3. অ্যাপ্লিকেশনটির "অনক্রিয়েট" পদ্ধতিতে, আপনি হ্যান্ডলারটি ইনস্ট্যান্ট করতে পারেন;
  4. যদি সিঙ্গলটন কোনও-ইউআই থ্রেডে কার্যকর করা হয় তবে আপনি হ্যান্ডলারকে ইনস্ট্যান্ট করতে পারবেন না;
  5. অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপগুলির জীবনচক্র পরিচালনা করার দক্ষতা রয়েছে t এটিতে "রেজিস্ট্রেশনএকটিভিটি লাইফিসাইকেলক্যালব্যাকস" পদ্ধতি রয়েছে। তবে একক সিলেটের সক্ষমতা নেই।

1
দ্রষ্টব্য: আপনি যে কোনও থ্রেডে হ্যান্ডলার ইনস্ট্যান্ট করতে পারেন। দস্তাবেজ থেকে: "আপনি যখন একটি নতুন হ্যান্ডলার তৈরি করেন, তখন এটি থ্রেড / ম্যাসেজের সারিতে আবদ্ধ হয় যা এটি তৈরি করছে"
খ্রিস্ট

1
@ খ্রিস্ট আপনাকে ধন্যবাদ! ঠিক এখনই আমি "লুপার পদ্ধতি" শিখেছি থ্রেডের ভিতরে হ্যান্ডলার তৈরি করতে পারবেন না যা লুপার.প্রিয়প্রে () "বলে না।
রোদ

11

আমার একই সমস্যা ছিল: সিঙ্গলটন বা একটি সাবক্লাস তৈরি করুন Android.os. প্রয়োগ?

প্রথমে আমি সিঙ্গলটনের সাহায্যে চেষ্টা করেছি তবে আমার অ্যাপ্লিকেশনটি এক পর্যায়ে ব্রাউজারে কল দেয়

Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));

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

সমাধান: অ্যাপ্লিকেশন শ্রেণির একটি সাবক্লাসের ভিতরে প্রয়োজনীয় ডেটা রাখুন।


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

ঠিক আছে, অ্যাপ্লিকেশন পুনঃসূচনা করার পরে সিঙ্গেলটন অলস লোডিং জিসি দ্বারা বস্তুকে সরিয়ে দেওয়ার সঠিক উপায় নয়। দুর্বল রেফারেন্সস, তাইনা?
মিসচোনকার

15
সত্যি? দলভিক ক্লাস খুলে প্রোগ্রামের হারায়? আপনি কি নিশ্চিত যে এটি আবর্জনা-সীমাবদ্ধ-জীবদ্দশায় ক্রিয়াকলাপ সম্পর্কিত জিনিসগুলি সাজানোর কাজ যা আপনি প্রথম স্থানে সিঙ্গলটনে স্থাপন করা উচিত নয়? এমন অসাধারণ দাবির জন্য আপনাকে ক্লারারের উদাহরণ দিতে হবে!
অ্যান্ড্রয়েড.ওয়েসেল

1
পরিবর্তনগুলি না হলে আমি অজানা, ডালভিক ক্লাসগুলি আনলোড করে না । কখনো। তারা যে আচরণটি দেখছে তা হ'ল তাদের প্রক্রিয়াটি ব্রাউজারের জন্য জায়গা তৈরি করার জন্য পটভূমিতে মারা গিয়েছিল। তারা সম্ভবত তাদের "মূল" ক্রিয়াকলাপে ভেরিয়েবলটি সূচনা করছিল যা ব্রাউজার থেকে ফিরে আসার সময় নতুন প্রক্রিয়াটিতে তৈরি করা নাও হতে পারে।
গ্রাওক্সিক্স

5

একই সাথে উভয় বিবেচনা করুন:

  • ক্লাসের ভিতরে স্থির দৃষ্টান্ত হিসাবে সিঙ্গলটন অবজেক্ট থাকা।
  • একটি সাধারণ শ্রেণি (প্রসঙ্গ) থাকা যা আপনার আবেদনের সমস্ত সিগেলটন বস্তুর জন্য সিঙ্গলটন দৃষ্টান্ত দেয়, যার সুবিধা রয়েছে যে কনটেক্সটে মেথডের নামগুলি অর্থবহ হবে উদাহরণস্বরূপ: কনটেক্সট.জেটএলজিগেনইউজার () এর পরিবর্তে ইউজার.জিটইন্সট্যান্স ()।

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


4

তারা আসলে একই। আমি দেখতে পাচ্ছি একটি পার্থক্য আছে। অ্যাপ্লিকেশন ক্লাসের সাহায্যে আপনি আপনার ভেরিয়েবলগুলি অ্যাপ্লিকেশন.অনক্রিয়েট () এ আরম্ভ করতে পারেন এবং এটিকে অ্যাপ্লিকেশন.অন্টারমিনেট () এ ধ্বংস করতে পারেন। সিঙ্গলটনের সাথে আপনাকে ভিএম আরম্ভ এবং স্ট্যাটিক্স ধ্বংস করার উপর নির্ভর করতে হবে।


16
অন্টার্মিনেটের ডক্সগুলি বলে যে এটি কেবল কখনও এমুলেটর দ্বারা ডাকা হয়। ডিভাইসে সেই পদ্ধতিটি সম্ভবত কল করা হবে না। বিকাশকারী.অ্যান্ড্রয়েড.
com

3

আমার 2 সেন্ট:

আমি লক্ষ্য করেছি যে আমার ক্রিয়াকলাপটি ধ্বংস হয়ে যাওয়ার পরে কিছু একক / স্থির ক্ষেত্রগুলি পুনরায় সেট করা হয়েছিল। আমি এটি কয়েকটি নিম্ন প্রান্তের ২.৩ ডিভাইসে লক্ষ্য করেছি।

আমার কেসটি খুব সহজ ছিল: আমার কাছে কেবল একটি প্রাইভেট ফাইল করা "init_done" এবং একটি অচলিত পদ্ধতি "init" রয়েছে যা আমি ক্রিয়াকটি.অনক্রিয়েট () থেকে কল করেছি। আমি লক্ষ্য করেছি যে পদ্ধতিটি উদ্যোগটি কিছু পুনরায় ক্রিয়াকলাপের পুনরায় সম্পাদন করছিল।

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

আমি সিঙ্গলটনের আমার উদাহরণটি অ্যাপ্লিকেশনের একটি সাব ক্লাসে স্থানান্তরিত করেছি। আমি অ্যাপ্লিকেশন উদাহরণ থেকে তাদের অ্যাক্সেস। এবং, এর পর থেকে আর সমস্যাটি লক্ষ্য করেনি।

আমি আশা করি এটি কারও সাহায্য করতে পারে।


3

প্রবাদ বাক্য ঘোড়ার মুখ থেকে ...

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

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

public class AndroidApplication extends Application {

    private static AndroidApplication sInstance;

    public static AndroidApplication getInstance(){
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
    }
}

2

আমার ক্রিয়াকলাপ ফিনিসকে কল করে () (যা এটি অবিলম্বে শেষ করে না, তবে শেষ পর্যন্ত করবে) এবং গুগল স্ট্রিট ভিউয়ারকে কল করে। যখন আমি এটিকে ক্লিপসে ডিবাগ করব তখন স্ট্রিট ভিউয়ারকে ডাকা হলে অ্যাপ্লিকেশনটির সাথে আমার সংযোগটি ভেঙে যায়, যা আমি মনে করি (সম্পূর্ণ) অ্যাপ্লিকেশনটি বন্ধ হয়ে গেছে, মনে করা যায় মেমরি মুক্ত করার জন্য (একক ক্রিয়াকলাপটি শেষ হওয়ার সাথে সাথে এই আচরণের কারণ হবে না) । তবুও, আমি onSaveInstanceState () এর মাধ্যমে একটি বান্ডলে রাজ্য সংরক্ষণ করতে এবং স্ট্যাকের পরবর্তী ক্রিয়াকলাপের অনক্রিট () পদ্ধতিতে এটি পুনরুদ্ধার করতে সক্ষম। হয় স্ট্যাটিক সিঙ্গলটন বা সাবক্লাসিং অ্যাপ্লিকেশন ব্যবহার করে আমি অ্যাপ্লিকেশনটি বন্ধ করে এবং হারাতে রাজ্যের মুখোমুখি (যদি না আমি এটি কোনও বান্ডেলে না সঞ্চয় করি)। সুতরাং আমার অভিজ্ঞতা থেকে তারা রাষ্ট্র সংরক্ষণের ক্ষেত্রে একই রকম। আমি লক্ষ্য করেছি যে সংযোগটি অ্যান্ড্রয়েড 1.১.২ এবং ৪.২.২ এ হারিয়ে গেছে তবে .7.০..7 বা ৩.২.৪ এ নয়,


"আমি লক্ষ্য করেছি যে সংযোগটি অ্যান্ড্রয়েড 1.১.২ এবং ৪.২.২ এ হারিয়ে গেছে তবে .7.০..7 বা ৩.২.৪ এ নয়, যা আমার বুঝতে বোঝায় যে মেমরি পুনরুদ্ধারের ব্যবস্থাটি কোনও এক সময় পরিবর্তিত হয়েছে।" ..... আমি ভাবব যে আপনার ডিভাইসে একই পরিমাণে উপলব্ধ মেমরি নেই এবং একই অ্যাপ্লিকেশন ইনস্টল করা নেই। এবং তাই আপনার উপসংহারটি ভুল হতে পারে
খ্রিস্ট

@ খ্রিস্ট: হ্যাঁ আপনি অবশ্যই ঠিক বলেছেন। সংস্করণগুলির মধ্যে স্মৃতি পুনরুদ্ধার প্রক্রিয়াটি পরিবর্তিত হলে এটি আশ্চর্যজনক হবে। সম্ভবত বিভিন্ন মেমরির ব্যবহারের কারণে স্বতন্ত্র আচরণের সৃষ্টি হয়েছিল।
পাইভজান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.