Example of MVP, Dagger2, RxAndroid and Retrofit
Can you provide some example contains all of this?
Br Andrzej Walas
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)
- main/
- utils/ (Schedulers, etc.)
- 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.