Estoy tratando de pasar datos de la Actividad A a la Actividad B pero sin usar Intent putExtra ni SharePreferences, estoy usando un patrón MVVM en kotlin, así que ahora estoy usando una declaración de objeto como esta
object SharedData{ var myMovies: ArrayList<Movie>? = null }Entonces, más adelante en la Actividad A, estoy asignando un valor como este
val movieList = ArrayList<Movie>() movieList.add(Movie("The Purge")) SharedData.myMovies = movieListY luego en la Actividad B recupero este valor por:
val movieList = ArrayList<Movie>() SharedData.myMovies.let { movieList = it }Pero soy nuevo en Kotlin y ahora sé que este no es el enfoque correcto. porque el objeto singleton asigna memoria y el GC nunca lo recopila. Así que ahora estoy atrapado aquí. Cualquier orientación o ayuda sería apreciada
Entonces, si está utilizando el patrón MVVM, es muy sencillo. Use la implementación básica de ViewModel con los componentes de la arquitectura de Android. Vea más de esto en 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>() }Mi sugerencia sería: si desea compartir los datos solo entre dos actividades, debe usar la intención y enviar el contenido como objeto parcelable (array parcelable para su escenario de lista de películas) a la siguiente actividad. Esta sería una implementación limpia.
Pero soy nuevo en Kotlin y ahora sé que este no es el enfoque correcto.
Tampoco es un enfoque incorrecto, se puede usar dependiendo de su caso de uso. Si cumple con todos los escenarios a continuación, puede optar por un enfoque de variable estática. Pero el objeto estático se borrará cuando se elimine la aplicación (ya sea por el usuario o por el sistema)
1.Si el tamaño de los datos almacenados es menor.
2. No es necesario que los datos se conserven al cerrar y reiniciar la aplicación.
3. Los datos se comparten entre muchas actividades.
el objeto singleton asigna memoria y el GC nunca lo recopila
Sí. Es cierto. Las variables estáticas no son elegibles para la recolección de basura. Pero siempre que la impresión de memoria sea muy inferior, está bien usar una variable estática siempre que cumpla con los escenarios mencionados anteriormente.