Dagger2+Retrofit2+RxJava、Mvp概要
2016-11-22 18:19
274 查看
请求天气的小应用,练习如何使用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' //添加apt apply 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/YangJiexian/AndroidMvp
-
相关文章推荐
- 仅仅有几个基类, 仅仅用Dagger注入几个工具类就敢叫MVP+Dagger+Retrofit+Rxjava框架?
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
- MVPArms MVP+Dagger+Rxjava+Retrofit快速集成框架
- 几篇RxJava/MVP/Retrofit/Dagger文章
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
- RxJava+Retrofit+MVP+Dagger2 谷歌四件套
- MVP+Retrofit+RxJava+Dagger框架
- Retrofit2-RxJava-Dagger2-MVP完美封装
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
- mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践
- Android -- 带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(二)
- Android-MVP-Dagger-Retrofit-Rxjava-Okhttp
- Dagger+MVP+Retrofit+Rxjava+Rxlifecycle Demo
- Android -- 带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)