我试图将数据从活动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
}
但是我是Kotlin的新手,现在我知道这不是正确的方法。因为单例对象分配内存,并且它永远不会被GC收集。所以现在我被困在这里。 任何指导或帮助将不胜感激
答案 0 :(得分:1)
因此,如果您使用的是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>()
}
答案 1 :(得分:0)
我的建议是-如果要在两个活动之间共享数据,则应使用intent并将内容作为可打包对象(对于Movielist场景使用parcelableArray)发送到下一个活动。这将是干净的实现。
但是我是Kotlin的新手,现在我知道这不是正确的方法。
这也不是错误的方法,能否使用取决于您的用例。如果满足以下所有情况,则可以使用静态变量方法。但是当应用程序被杀死时(由用户或系统),静态对象将被清除
1。如果存储的数据量较小。
2。无需在应用程序终止并重新启动时保留数据。
3。数据在许多活动之间共享。
单例对象分配内存,并且永远不会被其收集 GC
是的。这是真的。静态变量不符合垃圾回收的条件。但是只要内存打印量很少,只要满足上述情况,就可以使用静态变量。