Как использовать шаблон репозитория и шаблон взаимодействия в шаблоне презентации представления модели?

Я разрабатываю приложение с помощью шаблона Model View Presenter.

Я использую Retrofit, поэтому у меня есть ApiClient и ApiInterface с конечными точками. Я реализую интерфейс в классе RemoteDataSource, который вызываю в классе Repository.

У меня такой вопрос: как использовать класс Interactor, чтобы репозиторий взаимодействовал с Presenter?

Вот мой код до сих пор:

ApiInterface

public interface ApiInterface {

@GET("?")
Call<ArrayList<Movie>> getMoviesByTitle(@Query("t") String title,@Query("apiKey") String apiKey);

}

RemoteDataSource класс

private static MovieRemoteDataSource instance;
private final ApiInterface service;

public MovieRemoteDataSource(ApiInterface movieApi) {
    service = ApiClient.createService(ApiInterface.class);
}

public static MovieRemoteDataSource getInstance(ApiInterface movieApi) {
    if (instance == null) {
        instance = new MovieRemoteDataSource(movieApi);
    }
    return instance;
}

@Override
public void getMovies(String title, String apiKey, final LoadMovieCallBack callback) {
    service.getMoviesByTitle(title,apiKey).enqueue(new Callback<ArrayList<Movie>>() {
        @Override
        public void onResponse(Call<ArrayList<Movie>> call, Response<ArrayList<Movie>> response) {
            ArrayList<Movie> movies = response.body();// != null ? //response.body().getTitle() : null;
            if (movies != null && !movies.isEmpty()) {
                callback.onMoviesLoaded(movies);
            } else {
                callback.onDataNotAvailable();
            }
        }

        @Override
        public void onFailure(Call<ArrayList<Movie>> call, Throwable t) {
            callback.onError();
        }
    });
}

Интерфейс DataSource с обратным вызовом

public interface MovieDataSource {
    interface LoadMovieCallBack{
        void onMoviesLoaded(ArrayList<Movie> movies);
        void onDataNotAvailable();
        void onError();

    }

    void getMovies(String title, String apiKey,LoadMovieCallBack callback);

}

Репозиторий

 private MovieRemoteDataSource movieRemoteDataSource;


public MoviesRepository() {//ApiInterface movieApi) {
    //this.service = ApiClient.createService(ApiInterface.class);
}

public static MoviesRepository getInstance(ApiInterface service) {
    if (instance == null) {
        instance = new MoviesRepository();
    }
    return instance;
}





  public void getMovies(String title, String apiKey ) {
        movieRemoteDataSource.getMovies(title,apiKey,this);
    }

1 ответ

В MoviesRepository вы должны объявить функцию с помощью Callback. ВашPresenter следует реализовать MovieDataSource.LoadMovieCallBack и передай, когда звонишь MoviesRepository

  public void getMovies(String title, String apiKey,MovieDataSource.LoadMovieCallBack callback) {
        movieRemoteDataSource.getMovies(title,apiKey,callback);
  }

Вот гуглMVPуже сделано для примера приложения todo, вы можете сослаться на него. Но теперь он устарел, потому что Google рекомендуетMVVM

Другие вопросы по тегам