Friday 11 December 2020

Android ViewModel object recreate with kotlin but not with java

Im new to kotlin, and mvvm, but i was able to make it work in java, but when i made a new example mvvm-retrofit-corutines in kotlin, the view model gets called all the time on the OnCreate function is called, (which shouldn't happen according to docs and works fine in java).

MainActivity:

lateinit var viewModel : MyViewModel

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

    //Here we can see the logs in every orientation changed in the emulator.
    viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    viewModel.getMutableLiveDataModel().observe(this, Observer {
        Log.d("zzzz","lamda executes onChanged method -> "+ it.otherValues). //element from model
    })
}

MyViewModel:

 class MyViewModel : ViewModel() {

private lateinit var objectTypeModel: MutableLiveData<MyTestModel>

fun getMutableLiveDataModel():MutableLiveData<MyTestModel>{

    //Gets the model from a retrofit service call
    objectTypeModel = MyRepository.getModelFromService()

    return objectTypeModel
}
}

Am i doing something wrong? already tried convert 'viewModel' into local variable as suggested in other post.

Java Code, MainActivity

MyViewModel model;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    model =  new ViewModelProvider(this).get(MyViewModel.class);
    model.getUsers().observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(Integer users) {
            Log.d("zzzz","updated value..")
        }
    });
}

Model

 public class MyViewModel extends ViewModel {

private MutableLiveData<Integer> users;
public LiveData<Integer> getUsers() {
    if (users == null) {
        users = new MutableLiveData<Integer>();
        users.setValue(10);
    }
    return users;
}
}


from Android ViewModel object recreate with kotlin but not with java

No comments:

Post a Comment