Android: передать одну и ту же переменную между 3 действиями? - PullRequest
0 голосов
/ 22 декабря 2018

Итак, у меня есть класс данных (Kotlin), который создается в моей деятельности при запуске (мы просто назовем объект dataObj).У меня есть два других действия, которым нужен доступ к dataObj, который был создан при запуске.Я знаю, что мой класс данных мог бы реализовать интерфейс Serializable, чтобы я мог передавать объект между тремя действиями, используя намерения.Но я также думал, что я мог бы использовать статическую переменную в конструкторе, чтобы я мог просто получить значения для класса.Я просто пытаюсь понять, что рекомендуется и что такое хорошая практика.

Ответы [ 4 ]

0 голосов
/ 23 декабря 2018

Это не лучший метод (хотя на самом деле не существует идеального способа сделать это), но вы можете создать его экземпляр в пользовательском классе Application.

class App : Application() {

    val yourObject by lazy { YourObject() } //by lazy is useful if the Object needs to hold a Context or something that isn't immediately available

}

Добавить android:name=".App" втег application в вашем манифесте, так что ваш класс App фактически используется..App предполагает, что он находится в корне пакета вашего приложения.

Затем из любого места, где у вас есть ссылка на контекст, вы можете сделать что-то вроде:

(context.applicationContext as App).yourObject

для доступа к объекту..

0 голосов
/ 23 декабря 2018

У вас есть два варианта:

  1. Отправьте его через Intent после реализации Serializable или Parcelable вашим классом данных,
  2. Сохраните ваш объект данных в .txt файл и читать его, когда вам это нужно.

static он не создан для такого рода вещей, и вы не должны использовать его в этом случае.

ВМое мнение Вам стоит пойти с первым вариантом.

0 голосов
/ 23 декабря 2018

Это действительно зависит от вашего варианта использования, но я бы вообще рекомендовал не использовать статические реализации (чтобы включить синглтоны, см. Что такого плохого в синглетах? ).Они становятся трудными для адекватного тестирования с течением времени и могут (вкратце) привести к множеству других проблем в зависимости от реализации.

Если это относительно простой объект, где изменение состояния встречается редко, выполняется только в одном действии за рази / или не имеет значения, реализация Parcelable и передача этого каждому Activity через Intent, вероятно, лучше всего.

Если это сложный объект или объект, который может динамически изменяться, предпочтительнееРешением будет использование платформы внедрения зависимостей (например, Koin, если вы используете Kotlin) для создания экземпляров данных и предоставления их в качестве зависимости.Koin довольно прост, очень простая реализация с веб-сайта Koin (и для ее завершения не хватает всего нескольких строк):

// Injected by constructor
class MyViewModel(val repo : MyRepository) : ViewModel()

// declared ViewModel using the viewModel keyword
val myModule : Module = module {
  viewModel { MyViewModel(get()) } 
  single { MyRepository() }
}

// Just get it
class MyActivity() : AppCompatActivity() {

  // lazy inject MyViewModel
  val vm : MyViewModel by viewModel()
}

В этом случае ваш объект будет выглядеть как MyRepository() впример.Вам просто нужно добавить startKoin([list of modules]) оттуда.Если бы вы хотели MyRepository() в вашем Activity, вы бы включили его как val myRepo: MyRepository by inject().Я не знаю, выходит ли это за рамки вашего проекта, все зависит от того, что именно вы пытаетесь сделать.

0 голосов
/ 22 декабря 2018

Одна большая проблема заключается в том, что статические переменные не сохраняются в состоянии недостаточной памяти Android, а отправляют намерение между выжившими.Также читайте здесь о статической переменной. (Link)

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