Android 存储库之间的通信->;视图模型->;活动 我有一个活动附加到一个具有存储库的viewmodel 目前我正在使用一个接口来处理来自的进度事件 存储库来查看模型,然后我使用实时数据来处理回 活动
问题:如何删除接口并实现相同的效果,我遇到了我们需要使用转换的情况。如何做到这一点 MainActivityViewModel.javaAndroid 存储库之间的通信->;视图模型->;活动 我有一个活动附加到一个具有存储库的viewmodel 目前我正在使用一个接口来处理来自的进度事件 存储库来查看模型,然后我使用实时数据来处理回 活动,android,mvvm,android-livedata,Android,Mvvm,Android Livedata,问题:如何删除接口并实现相同的效果,我遇到了我们需要使用转换的情况。如何做到这一点 MainActivityViewModel.java public class MainActivityViewModel extends AndroidViewModel implements IntProgressCallback, IntErrorMessageCallback { private MovieServerRepository movieServerRepository; p
public class MainActivityViewModel extends AndroidViewModel implements IntProgressCallback, IntErrorMessageCallback {
private MovieServerRepository movieServerRepository;
private MovieLocalRepository localRepository;
private MutableLiveData<Boolean> liveProgress = new MutableLiveData<>();
private MutableLiveData<String> liveErrorMessage = new MutableLiveData<>();
public MainActivityViewModel(@NonNull Application application) {
super(application);
//Instantiate the repository
movieServerRepository = new MovieServerRepository(application,this,this);
localRepository = new MovieLocalRepository(application,this);
}
@Override
public void progressStart() {
liveProgress.postValue(true);
}
@Override
public void progressStop() {
liveProgress.postValue(false);
}
@Override
public void displayErrorMessage(String message) {
liveErrorMessage.postValue(message);
}
/** ********************************* LIVE DATA ********************************************* **/
/** LIVE-DATA, For data received from server **/
public LiveData<List<Movie>> getAllMovies() {
return movieServerRepository.getPopularMovies();
}
/** LIVE-DATA, inserted into local database **/
public LiveData<List<Movie>> insertMoviesIntoLocalDatabase(List<Movie> movies) {
return localRepository.createMovie(movies);
}
/** LIVE-DATA, for progress states **/
public MutableLiveData<Boolean> getLiveProgress() {
return liveProgress;
}
/** LIVE-DATA, for Error message states **/
public MutableLiveData<String> getLiveErrorMessage() {
return liveErrorMessage;
}
/** ********************************* LIVE DATA ********************************************* **/
/** Clear disposables **/
public void clearDisposables() {
movieServerRepository.clearDisposables();
localRepository.clearDisposables();
}
}
public class MovieServerRepository {
private Application application;
private List<Movie> movies = new ArrayList<>();
private Observable<PopularMovies> movieDBResponseObservable;
private MovieDataService movieDataService;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private MutableLiveData<List<Movie>> liveData = new MutableLiveData<>();
private IntProgressCallback progressCallback;
private IntErrorMessageCallback errorMessageCallback;
public MovieServerRepository(Application application,
MainActivityViewModel progressCallback,
MainActivityViewModel errorMessageCallback) {
this.application = application;
this.progressCallback = progressCallback;
this.errorMessageCallback = errorMessageCallback;
setRetrofitClient();
initObservable();
}
/************************************* INIT FUNCTIONS ******************************************/
private void initObservable() {
movieDBResponseObservable = movieDataService.getPopularMovies(Keys.API_KEY);
}
/** Retrofit client **/
private void setRetrofitClient() {
movieDataService = RetrofitInstance.getService();
}
/************************************* INIT FUNCTIONS ******************************************/
/** Clear disposables **/
public void clearDisposables() {
if(compositeDisposable !=null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
}
/************************************* MUTABLE DATA ********************************************/
/** Live data **/
public MutableLiveData<List<Movie>> getPopularMovies() {
compositeDisposable.add(getServerDataDisposable());
return liveData;
}
/************************************* MUTABLE DATA ********************************************/
/************************************* DISPOSABLES *********************************************/
/** Disposable for server data **/
private Disposable getServerDataDisposable() {
return movieDBResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((Function<PopularMovies, Observable<Movie>>) movieDBResponse -> Observable.fromArray(movieDBResponse.getResults().toArray(new Movie[0])))
.filter(movie -> true)
.subscribeWith(getObserver());
}
/** DisposableObserver for movies list from server data **/
private DisposableObserver getObserver() {
progressCallback.progressStart();
return new DisposableObserver<Movie>() {
@Override
public void onNext(Movie movie) {
movies.add(movie);
}
@Override
public void onError(Throwable e) {
progressCallback.progressStop();
errorMessageCallback.displayErrorMessage(e.getMessage());
}
@Override
public void onComplete() {
liveData.postValue(movies);
progressCallback.progressStop();
}
};
}
/************************************* DISPOSABLES *********************************************/
}
public class MainActivity extends AppCompatActivity implements IntProgressCallback {
private RecyclerView recyclerView;
private MovieAdapter movieAdapter;
private Loading loading;
private Call<PopularMovies> call;
private Observable<PopularMovies> movieDBResponseObservable;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
//private MoviesAppDatabase moviesAppDatabase;
private MainActivityViewModel activityViewModel;
@Inject
public MoviesAppDatabase moviesAppDatabase;
/************************************ Life Cycle Methods ***************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initOnCreate();
}
@Override
protected void onDestroy() {
super.onDestroy();
initOnDestroy();
}
/************************************ Life Cycle Methods ***************************************/
@Override
public void progressStart() {
startLoading();
}
@Override
public void progressStop() {
stopLoading();
}
/************************************ Init Methods *********************************************/
/** INIT onCreate **/
private void initOnCreate() {
setContentView(R.layout.activity_main);
App.getApp().getMovieAppComponent().inject(this);
findViews();
initViewModel();
showOnRecyclerView();
getPopularMovies();
progressStates();
errorMessages();
}
/** INIT onDestroy **/
private void initOnDestroy() {
if(compositeDisposable !=null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
activityViewModel.clearDisposables();
}
/************************************ Init Methods *********************************************/
/************************************ Custom Methods *******************************************/
/** Find views for the screen **/
private void findViews() {
recyclerView = findViewById(R.id.rvMovies);
loading = findViewById(R.id.loading);
}
/** Init view model **/
private void initViewModel() {
activityViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
}
/** Set up RecyclerView **/
private void showOnRecyclerView() {
movieAdapter = new MovieAdapter(this);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
}
recyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(this, R.anim.grid_layout_animation_from_bottom));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(movieAdapter);
}
/** Stop loading **/
private void stopLoading() {
loading.Cancel();
}
/** Start Loading **/
private void startLoading() {
loading.Start();
}
/************************************ Custom Methods *******************************************/
/************************************ LIFE CYCLE CALLBACKS *************************************/
public void getPopularMovies() {
/** Single call from server **/
/*activityViewModel.getAllMovies().observe(this, new Observer<List<Movie>>() {
@Override
public void onChanged(List<Movie> movies) {
Log.d("",movies+"");
mMovies = movies;
}
});*/
/** Combining two live data **/
Transformations.switchMap(
activityViewModel.getAllMovies(), (x) ->
activityViewModel.insertMoviesIntoLocalDatabase(x))
.observe(this, movies ->
movieAdapter.setData(new ArrayList<>(movies))
);
}
/** Progress States **/
private void progressStates() {
activityViewModel.getLiveProgress().observe(this, newValue -> {
if(newValue){
startLoading();
}else{
stopLoading();
}
});
}
/** Error Messages **/
private void errorMessages() {
activityViewModel.getLiveErrorMessage().observe(this, newValue -> Toast.makeText(this,newValue,Toast.LENGTH_LONG).show());
}
/************************************ LIFE CYCLE CALLBACKS *************************************/
}
public类MainActivityViewModel扩展了AndroidViewModel,实现了IntProgressCallback、InterormessageCallback{
私有MovieServerRepository MovieServerRepository;
私有MovieLocalRepository本地存储库;
私有MutableLiveData liveProgress=新的MutableLiveData();
私有MutableLiveData liveErrorMessage=新的MutableLiveData();
public MainActivityViewModel(@NonNull应用程序){
超级(应用);
//实例化存储库
movieServerRepository=新的movieServerRepository(应用程序,这个,这个);
localRepository=新的MovieLocalRepository(应用程序,此);
}
@凌驾
public void progressStart(){
liveProgress.postValue(true);
}
@凌驾
公共图书馆{
liveProgress.postValue(false);
}
@凌驾
public void displayErrorMessage(字符串消息){
liveErrorMessage.postValue(消息);
}
/**现场数据**/
/**实时数据,用于从服务器接收的数据**/
公共LiveData getAllMovies(){
返回movieServerRepository.getPopularMovies();
}
/**实时数据,插入本地数据库**/
公共LiveData insertMoviesIntoLocalDatabase(列出电影){
返回localRepository.createMovie(电影);
}
/**实时数据,用于进度状态**/
公共可变LiveData getLiveProgress(){
返回现场进度;
}
/**实时数据,用于错误消息状态**/
public MutableLiveData getLiveErrorMessage(){
返回liveErrorMessage;
}
/**现场数据**/
/**干净的一次性用品**/
可处置公共物品(){
movieServerRepository.clearDisposables();
localRepository.clearDisposables();
}
}
MovieServerRepository.java
public class MainActivityViewModel extends AndroidViewModel implements IntProgressCallback, IntErrorMessageCallback {
private MovieServerRepository movieServerRepository;
private MovieLocalRepository localRepository;
private MutableLiveData<Boolean> liveProgress = new MutableLiveData<>();
private MutableLiveData<String> liveErrorMessage = new MutableLiveData<>();
public MainActivityViewModel(@NonNull Application application) {
super(application);
//Instantiate the repository
movieServerRepository = new MovieServerRepository(application,this,this);
localRepository = new MovieLocalRepository(application,this);
}
@Override
public void progressStart() {
liveProgress.postValue(true);
}
@Override
public void progressStop() {
liveProgress.postValue(false);
}
@Override
public void displayErrorMessage(String message) {
liveErrorMessage.postValue(message);
}
/** ********************************* LIVE DATA ********************************************* **/
/** LIVE-DATA, For data received from server **/
public LiveData<List<Movie>> getAllMovies() {
return movieServerRepository.getPopularMovies();
}
/** LIVE-DATA, inserted into local database **/
public LiveData<List<Movie>> insertMoviesIntoLocalDatabase(List<Movie> movies) {
return localRepository.createMovie(movies);
}
/** LIVE-DATA, for progress states **/
public MutableLiveData<Boolean> getLiveProgress() {
return liveProgress;
}
/** LIVE-DATA, for Error message states **/
public MutableLiveData<String> getLiveErrorMessage() {
return liveErrorMessage;
}
/** ********************************* LIVE DATA ********************************************* **/
/** Clear disposables **/
public void clearDisposables() {
movieServerRepository.clearDisposables();
localRepository.clearDisposables();
}
}
public class MovieServerRepository {
private Application application;
private List<Movie> movies = new ArrayList<>();
private Observable<PopularMovies> movieDBResponseObservable;
private MovieDataService movieDataService;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private MutableLiveData<List<Movie>> liveData = new MutableLiveData<>();
private IntProgressCallback progressCallback;
private IntErrorMessageCallback errorMessageCallback;
public MovieServerRepository(Application application,
MainActivityViewModel progressCallback,
MainActivityViewModel errorMessageCallback) {
this.application = application;
this.progressCallback = progressCallback;
this.errorMessageCallback = errorMessageCallback;
setRetrofitClient();
initObservable();
}
/************************************* INIT FUNCTIONS ******************************************/
private void initObservable() {
movieDBResponseObservable = movieDataService.getPopularMovies(Keys.API_KEY);
}
/** Retrofit client **/
private void setRetrofitClient() {
movieDataService = RetrofitInstance.getService();
}
/************************************* INIT FUNCTIONS ******************************************/
/** Clear disposables **/
public void clearDisposables() {
if(compositeDisposable !=null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
}
/************************************* MUTABLE DATA ********************************************/
/** Live data **/
public MutableLiveData<List<Movie>> getPopularMovies() {
compositeDisposable.add(getServerDataDisposable());
return liveData;
}
/************************************* MUTABLE DATA ********************************************/
/************************************* DISPOSABLES *********************************************/
/** Disposable for server data **/
private Disposable getServerDataDisposable() {
return movieDBResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((Function<PopularMovies, Observable<Movie>>) movieDBResponse -> Observable.fromArray(movieDBResponse.getResults().toArray(new Movie[0])))
.filter(movie -> true)
.subscribeWith(getObserver());
}
/** DisposableObserver for movies list from server data **/
private DisposableObserver getObserver() {
progressCallback.progressStart();
return new DisposableObserver<Movie>() {
@Override
public void onNext(Movie movie) {
movies.add(movie);
}
@Override
public void onError(Throwable e) {
progressCallback.progressStop();
errorMessageCallback.displayErrorMessage(e.getMessage());
}
@Override
public void onComplete() {
liveData.postValue(movies);
progressCallback.progressStop();
}
};
}
/************************************* DISPOSABLES *********************************************/
}
public class MainActivity extends AppCompatActivity implements IntProgressCallback {
private RecyclerView recyclerView;
private MovieAdapter movieAdapter;
private Loading loading;
private Call<PopularMovies> call;
private Observable<PopularMovies> movieDBResponseObservable;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
//private MoviesAppDatabase moviesAppDatabase;
private MainActivityViewModel activityViewModel;
@Inject
public MoviesAppDatabase moviesAppDatabase;
/************************************ Life Cycle Methods ***************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initOnCreate();
}
@Override
protected void onDestroy() {
super.onDestroy();
initOnDestroy();
}
/************************************ Life Cycle Methods ***************************************/
@Override
public void progressStart() {
startLoading();
}
@Override
public void progressStop() {
stopLoading();
}
/************************************ Init Methods *********************************************/
/** INIT onCreate **/
private void initOnCreate() {
setContentView(R.layout.activity_main);
App.getApp().getMovieAppComponent().inject(this);
findViews();
initViewModel();
showOnRecyclerView();
getPopularMovies();
progressStates();
errorMessages();
}
/** INIT onDestroy **/
private void initOnDestroy() {
if(compositeDisposable !=null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
activityViewModel.clearDisposables();
}
/************************************ Init Methods *********************************************/
/************************************ Custom Methods *******************************************/
/** Find views for the screen **/
private void findViews() {
recyclerView = findViewById(R.id.rvMovies);
loading = findViewById(R.id.loading);
}
/** Init view model **/
private void initViewModel() {
activityViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
}
/** Set up RecyclerView **/
private void showOnRecyclerView() {
movieAdapter = new MovieAdapter(this);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
}
recyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(this, R.anim.grid_layout_animation_from_bottom));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(movieAdapter);
}
/** Stop loading **/
private void stopLoading() {
loading.Cancel();
}
/** Start Loading **/
private void startLoading() {
loading.Start();
}
/************************************ Custom Methods *******************************************/
/************************************ LIFE CYCLE CALLBACKS *************************************/
public void getPopularMovies() {
/** Single call from server **/
/*activityViewModel.getAllMovies().observe(this, new Observer<List<Movie>>() {
@Override
public void onChanged(List<Movie> movies) {
Log.d("",movies+"");
mMovies = movies;
}
});*/
/** Combining two live data **/
Transformations.switchMap(
activityViewModel.getAllMovies(), (x) ->
activityViewModel.insertMoviesIntoLocalDatabase(x))
.observe(this, movies ->
movieAdapter.setData(new ArrayList<>(movies))
);
}
/** Progress States **/
private void progressStates() {
activityViewModel.getLiveProgress().observe(this, newValue -> {
if(newValue){
startLoading();
}else{
stopLoading();
}
});
}
/** Error Messages **/
private void errorMessages() {
activityViewModel.getLiveErrorMessage().observe(this, newValue -> Toast.makeText(this,newValue,Toast.LENGTH_LONG).show());
}
/************************************ LIFE CYCLE CALLBACKS *************************************/
}
公共类MovieServerRepository{
私人申请;
private List movies=new ArrayList();
私人可观察电影响应可观察;
私有电影数据服务电影数据服务;
私有CompositeDisposable CompositeDisposable=新CompositeDisposable();
私有MutableLiveData liveData=新的MutableLiveData();
私有IntProgressCallback progressCallback;
专用InterormessageCallback errorMessageCallback;
公共MovieServerRepository(应用程序,
MainActivityViewModel progressCallback,
MainActivityViewModel错误消息(回调){
这个应用程序=应用程序;
this.progressCallback=progressCallback;
this.errorMessageCallback=errorMessageCallback;
setclient();
initObservable();
}
/*************************************初始化函数******************************************/
私有void initObservable(){
movieDBResponseObservable=movieDataService.getPopularMovies(KEY.API_KEY);
}
/**改造客户端**/
私有void客户端(){
movieDataService=instance.getService();
}
/*************************************初始化函数******************************************/
/**干净的一次性用品**/
可处置公共物品(){
if(compositeDisposable!=null&&!compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
}
/*************************************可变数据********************************************/
/**实时数据**/
public MutableLiveData getPopularMovies(){
add(getServerDataDisposable());
返回liveData;
}
/*************************************可变数据********************************************/
/*************************************一次性用品*********************************************/
/**服务器数据的一次性存储**/
私有一次性getServerDataDisposable(){
返回movieDBResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((函数)movieDBResponse->Observable.fromArray(movieDBResponse.getResults().toArray(新电影[0]))
.filter(电影->真实)
.subscribowith(getObserver());
}
/**来自服务器数据的电影列表的DisposableObserver**/
私有可处置观察者getObserver(){
progressCallback.progressStart();
返回新的DisposableObserver(){
@凌驾
下一部(电影){
添加(电影);
}
@凌驾
公共无效申报人(可丢弃的e){
progressCallback.progressStop();
errorMessageCallback.displayErrorMessage(例如getMessage());
}
@凌驾
未完成的公共空间(){
liveData.postValue(电影);
progressCallback.progressStop();
}
};
}
/*************************************