, !
ViewModels and LiveData: Patterns + AntiPatterns Jose Alc'erreca.
View ViewModel
, :
ViewModel Android. , - . ViewModel android.* ( android.arch.*). Presenter.
ViewModel ( Presenter) Android
, ViewModel , . View unit- ( , Robolectric), . View ViewModel ( Presenter). Passive View.
View ViewModel
ViewModels . , ViewModel , . ViewModel , .
ViewModels :
View ( ) ViewModel . , ViewModel , . View , .
View ViewModels.
ViewModel View observer pattern, LiveData observable .
Observer Pattern ( )
Android , View ( ) ( ) ViewModel. .. ViewModel Android, , Android View. :
- ViewModel , ( , ) .
- - , observable ViewModel . , . NPE View.
- ViewModel View, .
:
private void subscribeToModel() {
// Observe product data
viewModel.getObservableProduct().observe(this, new Observer() {
@Override
public void onChanged(@Nullable Product product) {
mTitle.setText(product.title);
}
});
}
, UI, UI .
ViewModel
. ViewModel , , :
, domain .
, . :
- :
- :
, presentation . . , .
.
: LiveData, ViewModel, . View ?
LiveData ViewModel. , MyDataState , , .
, (, ). . Resource (TODO: add link)
Expose , LiveData.
, , . ViewModel. ViewModel .
, ViewModel : , .
UI , onSaveInstanceState() ViewModel.
.:
ViewModels: Persistence, onSaveInstanceState(), Restoring UI State and Loaders Events
-, . ViewModel , ? , Snackbar , .
, LiveData . ViewModel :
LiveData snackbarMessage = new MutableLiveData<>();
ViewModel, ViewModel :
snackbarMessage.setValue(" !");
Snackbar. .
, , ViewModel. LiveData, !
,
SingleLiveEvent ( LiveData). , . , .
, Snackbar observable SingleLiveEvent.
ViewModels
Android, .. UI . LiveData , LiveData.
, ViewModels , . Presentation observer pattern Data, .
Observer pattern UI Data:
, ViewModel . - ,
. . ViewModel .
, ViewModel :
, ViewModel . ViewModel' , View, :
:
- ViewModel.onCleared() , ViewModel.
- WeakReference Event Bus ( ).
- LiveData ViewModel , View ViewModel.
, , .
ViewModel , . , ViewModel .
LiveData
ViewModel , :
ViewModel view , :
: ViewModel, LifecycleOwner?
. Transformations.switchMap LiveData, LiveData. observer :
LiveData repo = Transformations.switchMap(repoIdLiveData, repoId -> {
if (repoId.isEmpty()) {
return AbsentLiveData.create();
}
return repository.loadRepo(repoId);
}
);
[
]
, , . LifecycleOwner repository.loadRepo(id).
, , Lifecycle ViewModel, Transformation .
LiveData
LiveData MutableLiveData ViewModel LiveData , .
, LiveData , . , , .
public class MyLiveData extends LiveData {
public MyLiveData(Context context) {
// Initialize service
}
@Override
protected void onActive() {
// Start listening
}
@Override
protected void onInactive() {
// Stop listening
}
}
LiveData
onActive() - , , , , LiveData . :
start() ViewModel [.
Blueprints]
, [.
GithubBrowserExample].
LiveData . ViewModel .