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