Olá,
Irei responder a Segunda Pergunta e as outras logo abaixo
2 - Sim, ele foi deprecated recentimente e o correto a se usar é :
ViewModelProvider(activity/fragment, factory).get(Activity/FragmentViewModel)
1 - Para a primeira pergunta :
Segundo o próprio site do Android Developers se diz:
Visão geral do ViewModel
A classe ViewModel foi projetada para armazenar e gerenciar dados relacionados à IU considerando o ciclo de vida. A classe ViewModel permite que os dados sobrevivam às mudanças de configuração, como a rotação da tela.
Activity/Fragment mantém a mesma instância porém por alguma razão isso não se aplica aos dados, fazendo com que cada rotação uma nova busca seja efetuado.
Porém se todo esse gerenciamento de adição, remoção, atualização, leitura de dados fosse efetuado dentro do ViewModel, de fato iria se ter uma sobrecarga de trabalho dentro de uma classe, por isso o Repository.
Repository irá fazer a busca do RestApi e/ou Database interno(ROOM) passar pelo o MediatorLiveData e então retornar os dados em formato LiveData atualizados para o ViewModel que será responsável também em gerenciar o estado desses dados, retornando para a Activity/Fragment apenas aquilo que foi adicionado, alterado, removido e/ou atualizado.
Já respondendo a terceira pergunta, se tu usar o projeto de arquitetura MVVM ou MVI, se tem Estados(DataState e um ViewState) que observam esses valores por si só, então ao rotacionar não há uma captura de dados novamente pois esses já estão preenchidos nos states, e não há necessidade de criar um Observable dentro do ViewModel, apenas deixe esse trabalho para os States.
Caso tenha duvida sobre eles, tenho um exemplo usando o MVI:
class FragmentOneViewModel @Inject constructor(private val repository: Repository) : ViewModel()
//Captura o ação do usuário ao que ele quer fazer
private val _stateEvent: MutableLiveData<MainStateEvent> = MutableLiveData()
//Configurando a ViewState
private val _viewState: MutableLiveData<MainViewState> = MutableLiveData()
/**
mesma coisa que o getter ViewState :
fun getViewState() : MutableLiveData<MainViewState>
return _viewState*/
val viewState: MutableLiveData<MainViewState>
get() = _viewState
// faz a busca dos dados no que apenas o usuario quis fazer.
val dataState: LiveData<DataState<MainViewState>> = switchMap(_stateEvent) {
when (it) {
is MainStateEvent.GetPostEvent -> {
repository.blogPosts()
}
is None -> {
null
}
}
}
}
class FragmentOne : DaggerFragment() {
private fun subscribeObservers() {
// carrega os dados do estado
viewModel.dataState.observe(viewLifecycleOwner, Observer { dataState ->
//se houver dados carrega, se nao, nao faz nada
dataState.data?.let {
//adiciona os novos dados para o _viewState
})
viewModel.viewState.observe(viewLifecycleOwner, Observer { viewState ->
viewState.post?.let {
//adiciona os dados da _viewState para a view.
}
})
}
}
private fun loadPosts() {
framgnet_load_posts_button.setOnClickListener {
viewModel.setStateEvent(MainStateEvent.GetPostEvent())
}
}
É realmente um pouco complicado essa questão de arquitetura, te aconselho a tirar uma boa parte do tempo para dar uma olhada, porém uma vez que sabe as coisas se tornam muito, mas muito fáceis.
Espero ter ajudado.
Qualquer coisa estou disposto a tirar mais dúvidas.