java - অ্যান্ড্রয়েড বনাম অ্যাপ্লিকেশন কনটেক্সট vs. Singletons?




android design-patterns (7)

এককটি ব্যবহার করে বেশ কয়েকটি সমস্যা সংশোধন করে এবং এককোন প্যাটার্ন ব্যবহার করে অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির বেশ কয়েকটি উদাহরণ দেখে এই পোস্টটি স্মরণ করে আমি আশ্চর্য হলাম যে গ্লোবাল অ্যাপ্লিকেশন স্টেট (subclassing android.os.Aplication) এবং এটি প্রাপ্ত করার পরিবর্তে একক ঘটনাগুলির পরিবর্তে সিঙ্গলেটস ব্যবহার করা একটি ভাল ধারণা context.get অ্যাপ্লিকেশন ()) মাধ্যমে।

কি সুবিধা / অসুবিধা উভয় mechanisms আছে?

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

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

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

অ্যাপ্লিকেশন Singleton হিসাবে একই নয়। কারণ হয়:

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

আমার 2 সেন্ট

আমি লক্ষ্য করেছি যে আমার ক্রিয়াকলাপটি ধ্বংস হয়ে গেলে কিছু সিঙ্গলটন / স্ট্যাটিক ক্ষেত্র পুনরায় সেট করা হয়েছিল। আমি কিছু কম শেষ 2.3 ডিভাইস এই লক্ষ্য।

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

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

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

আমি এই কেউ সাহায্য করতে পারেন আশা করি।


আমি একই সমস্যা ছিল: Singleton বা একটি subclass android.os. অ্যাপ্লিকেশন তৈরি?

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

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

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

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


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

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

আমি এটি একটি বিরোধী-প্যাটার্ন বিবেচনা, এটি একটি খারাপ বস্তু ভিত্তিক শৈলী যা মূলত বিশ্বব্যাপী রাষ্ট্র বজায় রাখার পরিমাণ।

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

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


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

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

তদ্ব্যতীত, আমি প্রস্তাব করি যে আপনি আপনার কনটেক্সটটি সম্প্রসারিত করতে শুধুমাত্র একক্টোন বস্তুর অ্যাক্সেস অন্তর্ভুক্ত করতে পারবেন না তবে কিছু কার্যকারিতা যা বিশ্বব্যাপী অ্যাক্সেস করতে হবে যেমন উদাহরণ: context.logOffUser (), context.readSavedData (), ইত্যাদি সম্ভবত প্রসঙ্গটি পুনঃনামকরণ করা Facade তারপর জ্ঞান করা হবে।


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


প্ররোচিত ঘোড়ার মুখ থেকে ...

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

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

public class AndroidApplication extends Application {

    private static AndroidApplication sInstance;

    public static AndroidApplication getInstance(){
        return sInstance;
    }

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




singleton