Создать синглтон-класс с контекстом Android в качестве параметра в конструкторе - PullRequest
0 голосов
/ 30 января 2020

В моем приложении Android I мне нужно создать синглтон-класс и передать контекст android в качестве параметра конструктору:

фрагмент:

class RecognizedCheckDataService private constructor(context: Context) {
    private var context: Context? = null

    init { // default constructor
        this.context = context
        recognizedCheckDataDir =
            AndroidFileUtil.getInternalStoragePath(context, RECOGNIZED_CHECK_DATA)
    }

    companion object {
        var recognizedCheckDataDir: File? = null
        private val RECOGNIZED_CHECK_DATA = "RECOGNIZED_CHECK_DATA"
        private var instance: RecognizedCheckDataService? = null

        private val TAG = RecognizedCheckDataService::class.java.name

        @Synchronized
        fun getInstance(context: Context): RecognizedCheckDataService {
            if (instance == null) {
                instance = RecognizedCheckDataService(context)
            }
            return instance as RecognizedCheckDataService
        }

        fun deleteRecognizedCheckDataDir(): Boolean {
            try {
                // first check is exist and then delete
                FileUtils.deleteDirectory(recognizedCheckDataDir);
                return true
            } catch (e: IOException) {
                return false
            }
        }
    }
}

и использовать:

class Main : Application() {
    companion object {
        private lateinit var appContext: Context

        fun getAppContext(): Context {
            return appContext
        }    

    }

    override fun onCreate() {
        super.onCreate()
        //Debug.d(TAG, "onCreate: ENTRY_POINT")
        init()
    }

 private fun init() {
        appContext = this
        RecognizedCheckDataService.getInstance(appContext)
    }
}

Это правильный путь?

1 Ответ

0 голосов
/ 30 января 2020

Я всегда предпочитаю этот метод всякий раз, когда я хочу использовать одноэлементный объект в моем проекте

вам часто нужно передавать экземпляр контекста в блоки инициализации одноэлементных компонентов, чтобы они могли получать пути к файлам, читать настройки или получать доступ к сервисам , но вы также хотите избежать сохранения статической ссылки на нее c (даже если статическая c ссылка на контекст приложения технически безопасна). Для этого есть два способа:

1) Ранняя инициализация 2) Ленивая инициализация

Подробнее по следующей ссылке https://medium.com/@BladeCoder / kotlin - singletons-with-аргумент-194ef06edd9e

Используйте это, это может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...