MVVM kotlin在活动之间共享数据,而无需使用Intent和SharePreferences

时间:2019-01-06 03:13:53

标签: mvvm kotlin

我试图将数据从活动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收集。所以现在我被困在这里。 任何指导或帮助将不胜感激

2 个答案:

答案 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

是的。这是真的。静态变量不符合垃圾回收的条件。但是只要内存打印量很少,只要满足上述情况,就可以使用静态变量。