MVVM kotlin обменивается данными между действиями без использования Intents и SharePreferences - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь передать данные из Действия A в Деятельность B, но без использования Intent putExtra или SharePreferences, я использую шаблон MVVM в kotlin, поэтому сейчас я использую объявление объекта, подобное этому

object SharedData{ var myMovies: ArrayList<Movie>? = null }

Итак, позже в упражнении A я присваиваю значение, подобное этому

val movieList = ArrayList<Movie>()
movieList.add(Movie("The Purge"))
SharedData.myMovies = movieList

А затем в Деятельности B я получаю это значение по:

val movieList = ArrayList<Movie>()
    SharedData.myMovies.let {
        movieList = it
    }

Но я новичок в котлине, и теперь я знаю, что это неправильный подход. потому что одноэлементный объект выделяет память, и он никогда не собирается GC. Так что теперь я застрял здесь. Будем благодарны за любые рекомендации или помощь

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Итак, если вы используете паттерн MVVM, он очень прост. Используйте базовую реализацию ViewModel с компонентами архитектуры Android. Подробнее об этом в https://developer.android.com/topic/libraries/architecture/

class MyActivity : AppCompatActivity() {
    private lateinit var myViewModel: MyViewModel

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

        myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)

        myViewModel.myObject.observe(this, Observer { mySharedObject ->

            //TODO whatever you want to do with your data goes here
            Log.i("SomeTag", mySharedObject.anyData)
        })

    }

}

class MyCoachFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.let {
            myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java)
        }
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val myObject = MyObject() // what ever object you need to share between Activities and Fragments, it could be a data class or any object
        myViewModel.myObject.postValue(myObject)

    }


}


class MyViewModel : ViewModel() {
    var myObject = MutableLiveData<MyObject>()
}
0 голосов
/ 06 января 2019

Мое предложение будет таким: если вы хотите обмениваться данными только между двумя действиями, вы должны использовать намерение и отправлять содержимое как объект parcelable (parcelableArray для вашего сценария Movielist) для следующего действия. Это было бы чистой реализацией.

Но я новичок в котлине, и теперь я знаю, что это неправильный подход.

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

1.Если размер хранимых данных меньше.

2.Данные не нужно сохранять при уничтожении и повторном запуске приложения.

3.Данные используются во многих видах деятельности.

одноэлементный объект выделяет память, и он никогда не будет собран ГК

Да. Это так. Статические переменные не подходят для сборки мусора. Но пока объем памяти уменьшается, можно использовать статическую переменную, если она соответствует вышеупомянутым сценариям.

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