আমি কিছু সময়ের জন্য ডাগার 2 নিয়ে কাজ করছি। এবং আমি প্রতিটি ক্রিয়াকলাপ / খণ্ডের জন্য নিজস্ব উপাদান / মডিউল তৈরি করতে বিভ্রান্ত হয়ে পড়েছি। দয়া করে আমাকে এটি পরিষ্কার করতে সহায়তা করুন:
উদাহরণস্বরূপ, আমাদের একটি অ্যাপ রয়েছে এবং অ্যাপটিতে প্রায় 50 টি স্ক্রিন রয়েছে। আমরা ডিভিয়ের জন্য এমভিপি প্যাটার্ন এবং ড্যাগার 2 অনুসরণ করে কোডটি প্রয়োগ করব। মনে করুন যে আমাদের 50 টি ক্রিয়াকলাপ এবং 50 জন উপস্থাপক রয়েছে।
আমার মতে, সাধারণত আমাদের কোডটি এভাবে সাজানো উচিত:
একটি অ্যাপকোম্পোনেন্ট এবং অ্যাপমোডুল তৈরি করুন যা অ্যাপ্লিকেশনটি খোলা থাকাকালীন ব্যবহৃত সমস্ত সামগ্রী সরবরাহ করবে।
@Module public class AppModule { private final MyApplicationClass application; public AppModule(MyApplicationClass application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return this.application; } //... and many other providers } @Singleton @Component( modules = { AppModule.class } ) public interface AppComponent { Context getAppContext(); Activity1Component plus(Activity1Module module); Activity2Component plus(Activity2Module module); //... plus 48 methods for 48 other activities. Suppose that we don't have any other Scope (like UserScope after user login, ....) }
অ্যাক্টিভিটিস্কোপ তৈরি করুন:
@Scope @Documented @Retention(value=RUNTIME) public @interface ActivityScope { }
প্রতিটি ক্রিয়াকলাপের জন্য উপাদান এবং মডিউল তৈরি করুন। সাধারণত আমি তাদের ক্রিয়াকলাপ শ্রেণীর মধ্যে স্ট্যাটিক ক্লাস হিসাবে রাখি:
@Module public class Activity1Module { public LoginModule() { } @Provides @ActivityScope Activity1Presenter provideActivity1Presenter(Context context, /*...some other params*/){ return new Activity1PresenterImpl(context, /*...some other params*/); } } @ActivityScope @Subcomponent( modules = { Activity1Module.class } ) public interface Activity1Component { void inject(Activity1 activity); // inject Presenter to the Activity } // .... Same with 49 remaining modules and components.
আমি কীভাবে এটি বাস্তবায়ন করব তা দেখানোর জন্য সেগুলি কেবল খুব সাধারণ উদাহরণ।
তবে আমার এক বন্ধু আমাকে আরও একটি বাস্তবায়ন দিয়েছে:
PresenterModule তৈরি করুন যা সমস্ত উপস্থাপক সরবরাহ করবে:
@Module public class AppPresenterModule { @Provides Activity1Presenter provideActivity1Presentor(Context context, /*...some other params*/){ return new Activity1PresenterImpl(context, /*...some other params*/); } @Provides Activity2Presenter provideActivity2Presentor(Context context, /*...some other params*/){ return new Activity2PresenterImpl(context, /*...some other params*/); } //... same with 48 other presenters. }
AppModule এবং AppComp घटक তৈরি করুন:
@Module public class AppModule { private final MyApplicationClass application; public AppModule(MyApplicationClass application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return this.application; } //... and many other provides } @Singleton @Component( modules = { AppModule.class, AppPresenterModule.class } ) public interface AppComponent { Context getAppContext(); public void inject(Activity1 activity); public void inject(Activity2 activity); //... and 48 other methods for 48 other activities. Suppose that we don't have any other Scope (like UserScope after user login, ....) }
তার ব্যাখ্যাটি হ'ল: প্রতিটি ক্রিয়াকলাপের জন্য তাকে উপাদান এবং মডিউল তৈরি করতে হবে না। আমি মনে করি আমার বন্ধুদের ধারণা একেবারেই ভাল নয়, তবে আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন। এখানে কারণগুলি:
প্রচুর স্মৃতি ফাঁস :
- ব্যবহারকারীটির কেবল 2 টি ক্রিয়াকলাপ খোলা থাকলেও অ্যাপটি 50 টি উপস্থাপক তৈরি করবে।
- ব্যবহারকারী কোনও কার্যকলাপ বন্ধ করার পরে, তার উপস্থাপক এখনও রয়ে যাবে
যদি আমি একটি ক্রিয়াকলাপের দুটি উদাহরণ তৈরি করতে চাই তবে কী হবে? (তিনি কীভাবে দুটি উপস্থাপক তৈরি করতে পারেন)
অ্যাপ্লিকেশনটি আরম্ভ করতে অনেক সময় লাগবে (কারণ এতে অনেক উপস্থাপক, বস্তু তৈরি করতে হবে ...)
দীর্ঘ পোস্টের জন্য দুঃখিত, তবে দয়া করে আমাকে এবং আমার বন্ধুর জন্য এটি পরিষ্কার করতে আমাকে সহায়তা করুন, আমি তাকে বোঝাতে পারি না। আপনার মন্তব্য খুব প্রশংসা করা হবে।
/ ------------------------------------------------- ---------------------- /
একটি ডেমো করার পরে সম্পাদনা করুন।
প্রথমত, পান্ডাওয়াররিওর উত্তরের জন্য ধন্যবাদ। আমি এই প্রশ্ন জিজ্ঞাসা করার আগে একটি ডেমো তৈরি করা উচিত ছিল। আমি আশা করি এখানে আমার উপসংহারটি অন্য কাউকে সহায়তা করতে পারে।
- আমার বন্ধু যা করেছে সে মেমরি ফাঁসের কারণ নয় যতক্ষণ না সে সরবরাহকারী-পদ্ধতিগুলিতে কোনও সুযোগ দেয়। (উদাহরণস্বরূপ @ সিঙ্গেলটন, বা @ ইউজারস্কোপ, ...)
- আমরা অনেক উপস্থাপক তৈরি করতে পারি, যদি সরবরাহ-পদ্ধতিটির কোনও সুযোগ থাকে না। (সুতরাং, আমার দ্বিতীয় বিষয়টিও ভুল)
- ডাগার যখন উপস্থাপকগুলির প্রয়োজন হবে কেবল তখনই তাদের তৈরি করবে। (সুতরাং, অ্যাপ্লিকেশনটি আরম্ভ করতে খুব বেশি সময় নিবে না, আমি অলস ইনজেকশন দ্বারা বিভ্রান্ত হয়েছিলাম)
সুতরাং, আমি উপরে যে কারণগুলি বলেছি সেগুলি বেশিরভাগই ভুল। তবে এর অর্থ এই নয় যে আমাদের বন্ধুত্বের ধারণাটি দুটি কারণে অনুসরণ করা উচিত:
এটি উত্সের আর্কিটেকচারের পক্ষে ভাল নয়, যখন তিনি মডিউল / উপাদানগুলিতে সমস্ত উপস্থাপককে ইনটাইট করেন। (এটি ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে , সম্ভবত একক দায়িত্বের পূর্বেও))
যখন আমরা কোনও স্কোপ উপাদান তৈরি করি তখন আমরা জানতে পারি এটি কখন তৈরি এবং কখন এটি ধ্বংস হয়ে যায় যা মেমরি ফাঁস এড়ানোর জন্য একটি বিশাল সুবিধা। সুতরাং, প্রতিটি ক্রিয়াকলাপের জন্য আমাদের একটি @ActivityScope দিয়ে একটি উপাদান তৈরি করা উচিত। আসুন কল্পনা করুন, আমার বন্ধুদের বাস্তবায়নের সাথে, আমরা সরবরাহকারীর পদ্ধতিতে কোনও স্কোপ রাখতে ভুলে গেছি => মেমরি ফাঁস হবে।
আমার মতে, একটি ছোট অ্যাপ্লিকেশন (কেবলমাত্র কয়েকটি পর্দা অনেকগুলি নির্ভরতা ছাড়াই বা অনুরূপ নির্ভরতা সহ), আমরা আমার বন্ধুদের ধারণা প্রয়োগ করতে পারি, তবে অবশ্যই এটি প্রস্তাবিত নয়।
আরও পড়তে পছন্দ করুন: ডাগার 2 এ কোন উপাদানটির জীবনচক্রটি (অবজেক্ট গ্রাফ) নির্ধারণ করে? ডাগার 2 কার্যকলাপের সুযোগ, আমার কতগুলি মডিউল / উপাদানগুলির প্রয়োজন?
এবং আরও একটি দ্রষ্টব্য: আপনি যদি দেখতে চান যে কখন বস্তুটি ধ্বংস হয়ে যায়, আপনি সেই পদ্ধতিগুলিকে একসাথে কল করতে পারেন এবং জিসি তত্ক্ষণাত্ চলবে:
System.runFinalization();
System.gc();
আপনি যদি এই পদ্ধতিগুলির মধ্যে একটি ব্যবহার করেন তবে জিসি পরে চালানো হবে এবং আপনি ভুল ফলাফল পেতে পারেন।
ControllerModule
একটি নতুন তৈরি করবেPresenter
এবং তারপরে উপস্থাপকটি ইনজেকশনের মাধ্যমেActivity
বাFragment
। এর পক্ষে বা এর বিপরীতে কোন দৃ opinion় মতামত?