android - ऐप के फिर से शुरू होने के बाद सिंगलटन ऑब्जेक्ट शून्य हो जाता है



caching dependency-injection (1)

अपने एंड्रॉइड प्रोजेक्ट के लिए, मुझे ऐप के माध्यम से उपयोगकर्ता के बारे में डेटा तक पहुंचने के लिए वैश्विक सिंगलटन कैश ऑब्जेक्ट की आवश्यकता है।

एक समस्या तब होती है जब कोई ऐप बैकग्राउंड में चला जाता है और कुछ अन्य ऐप को इस्तेमाल करने के कुछ समय बाद मैं कैशे ऑब्जेक्ट में ऐप वेरिएबल को खोलने की कोशिश करता हूं। सब कुछ ठीक है जब मैं ऐप को मारता हूं और इसे फिर से खोलता हूं। मैं कैश ऑब्जेक्ट तक पहुंचने के लिए निर्भरता इंजेक्शन का उपयोग कर रहा हूं। अगर ऐसा हुआ तो ऐप फिर से शुरू क्यों नहीं होता? क्या कम मेमोरी स्थितियों में भी कैश वेरिएबल रखने के लिए कुछ एनोटेशन है?

यह मेरी कैश क्लास है

class Cache {
    var categories : Array<BaseResponse.Category>? = null
    var user : BaseResponse.User? = null
    var options : BaseResponse.OptionsMap? = null
    var order: MenuOrderDataModel? = null
}

यह DI के लिए स्टोरेज मॉड्यूल है

@Module class StorageModule {

    @Singleton @Provides fun getSharedPrefs(context: Context): SharedPreferences {
        return PreferenceManager.getDefaultSharedPreferences(context)
    }


    @Singleton @Provides fun getCache() : Cache = Cache()
}

मैं ऑब्जेक्ट @Inject lateinit var cache: Cache और फिर स्प्लैश स्क्रीन में उपयोगकर्ता डेटा के साथ पॉप्युलेट करें।

संपादित करें - अनुप्रयोग और लॉन्च गतिविधि से जोड़ा गया कोड स्निपेट

class MyApp : Application() {
    val component: ApplicationComponent by lazy {
        DaggerApplicationComponent
                .builder()
                .appModule(AppModule(this))
                .build()
    }

    companion object {
        @JvmStatic lateinit var myapp: MyApp 
    }

    override fun onCreate() {
        super.onCreate()
        myapp= this
        Fabric.with(this, Crashlytics())
    }
}

स्पलैश गतिविधि:

class SplashActivity : AppCompatActivity(), View.OnClickListener {

    @Inject lateinit var viewModel : ISplashViewModel
    private lateinit var disposable : Disposable

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        MyApp.myapp.component.inject(this)
}

आप दुर्घटनाग्रस्त हो रहे हैं क्योंकि आप एक गतिविधि में उन चरों को शुरू करते हैं, और उम्मीद करते हैं कि यह हमेशा अन्य गतिविधि में सेट हो।

लेकिन एंड्रॉइड उस तरह काम नहीं करता है, आप आसानी से दुर्घटनाग्रस्त हो सकते हैं क्योंकि कम मेमोरी की स्थिति होने के बाद, केवल वर्तमान गतिविधि पहले पर फिर से हो जाती है, पिछली गतिविधि को वापस नेविगेशन पर फिर से बनाया जाता है, और सभी स्थिर चर को शून्य कर दिया जाता है (क्योंकि प्रक्रिया तकनीकी रूप से पुनः आरंभ किया जाता है)।

इसे आज़माएं: अपने एप्लिकेशन को होम बटन के साथ बैकग्राउंड में रखें, Android Studio में TERMINATE बटन पर क्लिक करें, फिर लॉन्चर से ऐप को फिर से लॉन्च करें। आप इस घटना का अनुभव करेंगे।

समाधान: एक आधार गतिविधि में (या LiveData.onActive में) नल और पुन: प्रारंभ करने के लिए जाँच करें।





dagger-2