Android 存储库之间的通信->;视图模型->;活动 我有一个活动附加到一个具有存储库的viewmodel 目前我正在使用一个接口来处理来自的进度事件 存储库来查看模型,然后我使用实时数据来处理回 活动

Android 存储库之间的通信->;视图模型->;活动 我有一个活动附加到一个具有存储库的viewmodel 目前我正在使用一个接口来处理来自的进度事件 存储库来查看模型,然后我使用实时数据来处理回 活动,android,mvvm,android-livedata,Android,Mvvm,Android Livedata,问题:如何删除接口并实现相同的效果,我遇到了我们需要使用转换的情况。如何做到这一点 MainActivityViewModel.java public class MainActivityViewModel extends AndroidViewModel implements IntProgressCallback, IntErrorMessageCallback { private MovieServerRepository movieServerRepository; p

问题:如何删除接口并实现相同的效果,我遇到了我们需要使用转换的情况。如何做到这一点

MainActivityViewModel.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 *************************************/


}
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();
}
};
}
/*************************************