Dagger2+Retrofit2+RxJava练习、Mvp简介
来源:互联网 发布:java订票系统 编辑:程序博客网 时间:2024/06/05 05:45
请求天气的小应用,练习如何使用Dagger2+Retrofit2+RxJava
gradle配置
RxJava异步加载框架、Retrofit2网络框架、Dagger2依赖注入框架
- project/build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0' //apt必须添加 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }}
- project/app/build.gradle
apply plugin: 'com.android.application'//添加aptapply plugin: 'android-apt'android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "com.myweather" minSdkVersion 17 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.2.1' // Net compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4' compile 'com.squareup.okhttp3:okhttp:3.2.0' // Annotation compile 'com.google.dagger:dagger:2.0.2' apt 'com.google.dagger:dagger-compiler:2.0.2' provided 'org.glassfish:javax.annotation:10.0-b28' compile 'com.jakewharton:butterknife:7.0.1' // Rx compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.5'}
项目结构
Mvp流程
MainPresenter作为MainActivity和MainModel之间的桥梁,当MainActivity需要请求数据时,通知MainPresenter;MainPresenter通知MainModel需要数据,MainModel通过Retrofit从网络中获取数据,若是请求成功,则把数据传给MainPresenter,若是请求失败,则把失败信息传给MainPresenter。
MainPresenter从MainModel中获取数据信息后通知MainActivity更新数据。
MainActivity中的MainPresenter实例是由Dagger2注入的单例。
- MainActivity的源码
public class MainActivity extends AppCompatActivity implements MainView { @Bind(R.id.tv_displayWeather) TextView tv; @Bind(R.id.progressBar) ProgressBar progressBar; //Dagger不能注入私有变量 @Inject @Singleton public MainPresenter myPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 setContentView(R.layout.activity_main); ButterKnife.bind(this);//ButterKnife注入 initView(); } public void displayWeather(View view) { myPresenter.getData(); } @Override public void initView() { MainComponent component= DaggerMainComponent.builder().mainPresenterModule(new MainPresenterModule(this)).build(); component.inject(this); } @Override public void showData(MainModelBean mybean) { if(mybean==null){ tv.setText("请求失败"); } else{ MainModelBean.WeatherinfoEntity bean = mybean.getWeatherinfo(); String city=bean.getCity(); String wd=bean.getWD(); String ws=bean.getWS(); String time=bean.getTime(); String data="城市:"+city+"\n风向:"+wd+"\n风级:"+ws+"\n发布时间:"+time; tv.setText(data); } hideProgressBar(); } public void showProgressBar(){ progressBar.setVisibility(View.VISIBLE); } public void hideProgressBar(){ progressBar.setVisibility(View.GONE); }}
- MainView源码:
public interface MainView { void initView(); void showData(MainModelBean bean); void showProgressBar(); void hideProgressBar();}
- MainModel的代码如下:
public class MainModel { String baseUrl="http://www.weather.com.cn/adat/sk/"; private List<MainModelBean> list = new ArrayList<>(); private MainPresenter mainPresenter; public MainModel(MainPresenter mainPresenter){ this.mainPresenter=mainPresenter; } public void getData(){ Retrofit retrofit=new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); WeatherService service=retrofit.create(WeatherService.class); service.getModelBean("101010100") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new MySubscriber()); } interface WeatherService{ @GET("{cityId}"+".html") Observable<MainModelBean> getModelBean(@Path("cityId") String cityId); } class MySubscriber extends Subscriber<MainModelBean>{ @Override public void onCompleted() { mainPresenter.loadDataSuccess(list); } @Override public void onError(Throwable e) { mainPresenter.loadDataFailure(); } @Override public void onNext(MainModelBean mainModelBean) { list.add(mainModelBean); } }}
- MainPresenter源码如下:
public class MainPresenter { private MainView mainView; public MainModel mainModel=new MainModel(this); @Inject @Singleton public MainPresenter(MainView mainView) { this.mainView=mainView; } public void getData(){ mainView.showProgressBar(); mainModel.getData(); } public void loadDataSuccess(List<MainModelBean> list) { mainView.showData(list.get(0)); } public void loadDataFailure(){ mainView.showData(null); }}
- 源码地址:https://github.com/JiexianYang/MvpDagger2Sample -
0 0
- Dagger2+Retrofit2+RxJava练习、Mvp简介
- MVP+RxJava+Retrofit2+Dagger2
- Dagger2+Retrofit2+Rxjava 简介
- MVP+Dagger2+Retrofit2.0+Rxjava
- Retrofit2-RxJava-Dagger2-MVP完美封装
- 最近很火的MVP+Retrofit2+rxjava+Dagger2框架 -- MVP
- Android MVP 实现。基于Dagger2 + RxJava + Retrofit2 + Realm + ButterKnife + EventBus
- owspace 是基于 MVP+Dagger2+Retrofit2.0+Rxjava 的 APP
- android之dagger2+rxjava+retrofit2+mvp架构的结合
- mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践
- mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践
- MVP模式+Dagger2+Rxjava+retrofit2+lambda表达式 … retrofit2带进度的上传下载
- MVP+Dagger2+Retrofit+Rxjava
- RxJava+Retrofit+MVP+Dagger2
- RxJava+Retrofit+MVP+Dagger2
- 按照Google官方MVP+RxJava+Retrofit2+Dagger2的Demo自己另做一个,进行讲解。
- 清晰的MVP-封装 Retrofit2+Rxjava+Lamda+dagger2(可直接使用)
- MVP+Dagger2+Retrofit2.0+Rxjava看这一个例子就够了
- SQL(十八)-UPDATE,DELETE
- Mybatis逆向工程中出现Exception getting JDBC Driver的解决方法
- 上机练习
- Redis集群节点变化如何处理?
- 全局变量与局部变量
- Dagger2+Retrofit2+RxJava练习、Mvp简介
- 如何保持长时间高效学习
- IOS Runtime
- 我迷茫的IT工作之路(十)接下来不明的道路
- c++中this指针的理解及其用法
- 单例模式与double check
- cyk的烂代码
- 无法找到产品 Microsoft SQL Server VSS 编写器 的安装程序包
- 前端学算法(三):栈