Найти в Дзене

Как создать локальный кэш. Android

Достаточно частая ситуация, когда пользователь вводит какие-то данные приложения или просто что-то грузит, отвлекается на что-то, потом возвращается на наш экран, а все введенные/загруженные данные пропали. Конечно, пользователь расстраивается и грустит. Что с этим делать? Конечно, мы можем просто сохранять данные в базу, но зачастую это лишнее, да и займёт кучу времени разработчика. В этой ситуации самое простое — создать локальный кэш, который будет храниться ограниченное время, например, пока приложение открыто. Кстати, на одном из собеседований у меня был вопрос: «Как создать кэш картинок?». Всё ещё считаю, что это вопрос не для джуниоров. :)

Я создала самое простое приложение, где два экрана. На первом у нас кнопка, при нажатии на неё открывается вторая активити, где можно ввести какой-то текст. Если не использовать какой-либо кэш, то при нажатии назад все данные потеряются. При втором нажатии на кнопку данные снова придётся вводить.

-2

Весь код приложения можно найти здесь: https://gitlab.com/Ladgertha/cache-example

Я создала самый простой DataSource, который является синглтоном. Т.е. он существует в единственном экземпляре:

private const val NAME = "name"
class DataSource {
companion object {
val instance = DataSource() // синглтон
}
private val cache = HashMap<String, String>()
fun getCache(): String? {
return if(cache.isNotEmpty()) cache[NAME]
else null
}
fun saveCache(name: String?) {
name?.apply {
cache[NAME] = name
}
}
}

В классе всего два метода: сохранение кэша и проверка, есть ли там что-то. Во второй активити в onBackPressed я сохраняю текст, который у нас есть в EditText. В onCreate идём в dataSource и проверяем, есть ли там какой-то сохраненный текст. Если есть, то устанавливаем его. Всё просто.

class NameActivity : AppCompatActivity() {
private val dataSource = DataSource.instance
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_name)
dataSource.getCache()?.apply {
et_name.setText(this)
}
}
override fun onBackPressed() {
super.onBackPressed()
dataSource.saveCache(et_name.text.toString())
}
}
-3