architecture-samples icon indicating copy to clipboard operation
architecture-samples copied to clipboard

Example of MVP, Dagger2, RxAndroid and Retrofit

Open Jendrekpl opened this issue 7 years ago • 1 comments

Can you provide some example contains all of this?

Br Andrzej Walas

Jendrekpl avatar May 07 '18 21:05 Jendrekpl

MVP (Model-View-Presenter pattern)

Dagger 2 (Dependency Injection)

RxAndroid / RxJava (Reactive programming on Android)

Retrofit (HTTP client for REST APIs)

If you need to give them an actionable solution, you could respond with something like:

Example Response You can combine all four technologies with a small demo app, e.g., a simple "User List" app fetching data from a REST API.

Project Structure (MVP)

  • data/
    • model/ (POJOs)
    • network/ (Retrofit interfaces)
    • repository/ (Data sources)
  • di/ (Dagger components & modules)
  • ui/
    • main/
      • MainActivity (View)
      • MainPresenter (Presenter)
  • utils/ (Schedulers, etc.)
  1. Retrofit API Service

public interface ApiService { @GET("users") Single<List<User>> getUsers(); } 2. Dagger Module & Component

@Module public class NetworkModule { @Provides @Singleton Retrofit provideRetrofit() { return new Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); }

@Provides
@Singleton
ApiService provideApiService(Retrofit retrofit) {
    return retrofit.create(ApiService.class);
}

}

@Singleton @Component(modules = {NetworkModule.class}) public interface AppComponent { void inject(MainPresenter presenter); } 3. Presenter with RxAndroid

public class MainPresenter implements MainContract.Presenter {

private MainContract.View view;
private final ApiService apiService;
private final CompositeDisposable disposables = new CompositeDisposable();

@Inject
public MainPresenter(ApiService apiService) {
    this.apiService = apiService;
}

@Override
public void takeView(MainContract.View view) {
    this.view = view;
    loadUsers();
}

private void loadUsers() {
    disposables.add(apiService.getUsers()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            users -> view.showUsers(users),
            throwable -> view.showError(throwable.getMessage())
        ));
}

@Override
public void dropView() {
    disposables.clear();
    view = null;
}

} 4. View (Activity)

public class MainActivity extends AppCompatActivity implements MainContract.View {

@Inject MainPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerAppComponent.create().inject(this.presenter);
}

@Override
protected void onResume() {
    super.onResume();
    presenter.takeView(this);
}

@Override
protected void onPause() {
    super.onPause();
    presenter.dropView();
}

@Override
public void showUsers(List<User> users) {
    // Update UI
}

@Override
public void showError(String message) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}

} Key Points

MVP → MainContract defines View & Presenter interfaces, Activity implements View, Presenter handles business logic.

Dagger 2 → Handles dependency injection for Presenter & ApiService.

RxAndroid → Handles async network calls with Retrofit.

Retrofit → Fetches JSON data from a REST API.

VaradGupta23 avatar Aug 08 '25 11:08 VaradGupta23