MVVM kotlin在不使用Intents和SharePreferences的情况下在活动之间共享数据



我正试图将数据从活动A传递到活动B,但在没有使用Intent putExtra或SharePreferences的情况下,我在kotlin中使用MVVM模式,所以现在我使用像这样的对象声明

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
}

但我是科特林的新手,现在我知道这不是正确的方法。因为singleton对象分配内存,而GC永远不会收集它。所以现在我被困在这里了。如有任何指导或帮助,将不胜感激

因此,如果您使用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>()
}

我的建议是-如果你想在两个活动之间共享数据,你应该使用intent并将内容作为parcelableObject(对于你的电影列表场景,是parcelableArray)发送到下一个活动。这将是一个干净的实施。

但我是科特林的新手,现在我知道这不是正确的方法。

这也不是错误的方法,可以根据您的用例使用。如果它满足以下所有场景,您可以选择静态变量方法。但是静态对象将在应用程序被杀死时被清除(由用户或系统)

1.如果存储的数据大小较小。

2.数据不需要在应用程序终止和重新启动时持久化。

3.数据在许多活动中共享。

singleton对象分配内存,它从不被GC

是。这是真的。静态变量不符合垃圾收集的条件。但只要内存打印非常少,只要满足上述场景,就可以使用静态变量。

相关内容

最新更新