Dagger2+Retrofit2+RxJava、Mvp概要

请求天气的小应用,练习如何使用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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值