Android中RxJava+Retrofit2.0+MVP模式的整合

来源:互联网 发布:mac book复制粘贴 编辑:程序博客网 时间:2024/05/16 23:54

转载请标明出处:http://blog.csdn.net/u010046908/article/details/50781360 本文出自:【李东的博客】

MVP的工作原理

这里写图片描述

以上是MVP的工作原理图。其中大家注意的Presenter操作View和Mode都是通过接口来实现直接的调用。

MVP的工作流程

  • Presenter负责逻辑的处理,
  • Model提供数据,
  • View负责显示。
    作为一种新的模式,在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
      

RxJava和Retrofit2.0使用

这二者的使用我就不罗嗦了,github中后好多demo,大家自己看。

MVP、RxJava和Reterofit2.0三者的整合现在开始讲解

首先说一下本项目的结构

这里写图片描述

  • api包主要存放网络请求接口
  • bean包中存放实体类
  • model包中存放处理数据
  • pesenter包中存放主导器
  • view包中存放界面处理

view的代码:

public interface WeatherView {    void showProgress()    void hideProgress()    void loadWeather(WeatherData weatherData)}package com.lidong.demo.android_rapid_development_of_library.mvpimport android.os.Bundleimport android.support.v7.app.AppCompatActivityimport android.support.v7.widget.Toolbarimport android.util.Logimport android.widget.TextViewimport android.widget.Toastimport com.lidong.android_ibrary.LoadingUIHelperimport com.lidong.demo.android_rapid_development_of_library.Rimport com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherDataimport com.lidong.demo.android_rapid_development_of_library.mvp.presenter.WeatherPresenterimport com.lidong.demo.android_rapid_development_of_library.mvp.presenter.WeatherPresenterImpimport com.lidong.demo.android_rapid_development_of_library.mvp.view.WeatherViewimport butterknife.Bindimport butterknife.ButterKnifepublic class WeatherActivity extends AppCompatActivity implements WeatherView {    @Bind(R.id.toolbar)    Toolbar toolbar    @Bind(R.id.textView1)    TextView textView1    @Bind(R.id.textView2)    TextView textView2    @Bind(R.id.textView3)    TextView textView3    @Bind(R.id.textView4)    TextView textView4    @Bind(R.id.textView5)    TextView textView5    @Bind(R.id.textView6)    TextView textView6    @Bind(R.id.textView7)    TextView textView7    @Bind(R.id.textView8)    TextView textView8    @Bind(R.id.textView9)    TextView textView9    private WeatherPresenter mWeatherPresenter    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_weather)        ButterKnife.bind(this)        setSupportActionBar(toolbar)        mWeatherPresenter = new WeatherPresenterImp(this)        mWeatherPresenter.getWeatherData(, )    }    @Override    public void showProgress() {        LoadingUIHelper.showDialogForLoading(this,,false)    }    @Override    public void hideProgress() {        LoadingUIHelper.hideDialogForLoading()        Toast.makeText(this,,Toast.LENGTH_SHORT).show()    }    @Override    public void loadWeather(WeatherData weatherData) {        Log.d(,  + weatherData.toString())        textView1.setText(+weatherData.getResult().getToday().getCity())        textView2.setText(+weatherData.getResult().getToday().getWeek())        textView3.setText(+weatherData.getResult().getToday().getTemperature())        textView4.setText( +WeatherIDUtils.transfer(weatherData.getResult().getToday().getWeather_id().getFa()))        textView5.setText( + weatherData.getResult().getToday().getDressing_advice())        textView6.setText(+weatherData.getResult().getToday().getDressing_index())        textView7.setText(+weatherData.getResult().getToday().getUv_index())        textView8.setText(+weatherData.getResult().getToday().getDressing_advice())        textView9.setText(+weatherData.getResult().getToday().getTravel_index())    }}

model层中的代码

/** * * Created by lidong on 2016/3/2. */public interface WeatherModel {    /**     * 获取天气信息     * @param format      * @param city     */    void getWeatherData(String format,String city);}/** * Created by lidong on 2016/3/2. */public class WeatherModelImp  implements WeatherModel {    private WeatherOnListener mWeatherOnListener;    public WeatherModelImp(WeatherOnListener mWeatherOnListener) {        this.mWeatherOnListener = mWeatherOnListener;    }    @Override    public void getWeatherData(String format,String city) {                ApiManager.getWeatherData(format,city).subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Action1() {                    @Override                    public void call(WeatherData weatherData) {                        mWeatherOnListener.onSuccess(weatherData);                    }                }, new Action1() {                    @Override                    public void call(Throwable throwable) {                        mWeatherOnListener.onFailure(throwable);                    }                });    }    /**    *回调接口    */    public interface WeatherOnListener{        void onSuccess(WeatherData s);        void onFailure(Throwable e);    }}

presenter层中的代码:

/** * Created by lidong on 2016/3/2. */public interface WeatherPresenter {    /**     * 获取天气信息     * @param format     * @param city     */    void getWeatherData(String format, String city);}public class WeatherPresenterImp  implements WeatherPresenter ,WeatherModelImp.WeatherOnListener{    /**     * WeatherModel和WeatherView都是通过接口来实现,这就Java设计原则中依赖倒置原则使用     */   private WeatherModel mWeatherModel;   private WeatherView mWeatherView;    public WeatherPresenterImp( WeatherView mWeatherView) {        this.mWeatherModel = new WeatherModelImp(this);        this.mWeatherView = mWeatherView;    }    @Override    public void getWeatherData(String format, String city) {        mWeatherView.showProgress();        mWeatherModel.getWeatherData(format,city);    }    @Override    public void onSuccess(WeatherData s) {        mWeatherView.loadWeather(s);        mWeatherView.hideProgress();        Log.d(,  +  + s.toString() + );    }    @Override    public void onFailure(Throwable e) {        mWeatherView.hideProgress();        Log.d(,+e.getMessage());    }}

api层的代码

package com.lidong.demo.android_rapid_development_of_library.mvp.api;import com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherData;import retrofit.GsonConverterFactory;import retrofit.Retrofit;import retrofit.RxJavaCallAdapterFactory;import rx.Observable;/** * Created by lidong on 2016/3/2. */public class ApiManager {    private static final String ENDPOINT = ;    private static final Retrofit sRetrofit = new Retrofit .Builder()            .baseUrl(ENDPOINT)            .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())             .build();    private static final ApiManagerService apiManager = sRetrofit.create(ApiManagerService.class);    /**     * 获取天气数据     * @param city     * @return     */    public static Observable getWeatherData(String format, String city) {        return apiManager.getWeatherData(format,city,);    }}package com.lidong.demo.android_rapid_development_of_library.mvp.api;import com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherData;import retrofit.http.GET;import retrofit.http.Query;import rx.Observable;/** * @className:ApiManagerService * Created by lidong on 2016/3/2. */public interface ApiManagerService {    /**     * 获取数据     * @param cityname     * @param key     * @return     */    @GET()    Observable getWeatherData(@Query() String format,@Query() String cityname,@Query() String key);}

bean层的代码

package com.lidong.demo.android_rapid_development_of_library.mvp.bean;import java.util.List;/** * Created by Administrator on 2015/12/21. */public class WeatherData {    /**     * resultcode : 200     * reason : successed!     * result : {"sk":{"temp":"18","wind_direction":"东南风","wind_strength":"2级","humidity":"41%","time":"14:32"},"today":{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","city":"苏州","date_y":"2016年03月02日","dressing_index":"较冷","dressing_advice":"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。","uv_index":"弱","comfort_index":"","wash_index":"较适宜","travel_index":"较适宜","exercise_index":"较适宜","drying_index":""},"future":[{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","date":"20160302"},{"temperature":"11℃~21℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期四","date":"20160303"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期五","date":"20160304"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期六","date":"20160305"},{"temperature":"11℃~20℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期日","date":"20160306"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期一","date":"20160307"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期二","date":"20160308"}]}     * error_code : 0     */    private String resultcode;    private String reason;    /**     * sk : {"temp":"18","wind_direction":"东南风","wind_strength":"2级","humidity":"41%","time":"14:32"}     * today : {"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","city":"苏州","date_y":"2016年03月02日","dressing_index":"较冷","dressing_advice":"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。","uv_index":"弱","comfort_index":"","wash_index":"较适宜","travel_index":"较适宜","exercise_index":"较适宜","drying_index":""}     * future : [{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","date":"20160302"},{"temperature":"11℃~21℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期四","date":"20160303"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期五","date":"20160304"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期六","date":"20160305"},{"temperature":"11℃~20℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期日","date":"20160306"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期一","date":"20160307"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期二","date":"20160308"}]     */    private ResultEntity result;    private int error_code;    public void setResultcode(String resultcode) {        this.resultcode = resultcode;    }    public void setReason(String reason) {        this.reason = reason;    }    public void setResult(ResultEntity result) {        this.result = result;    }    public void setError_code(int error_code) {        this.error_code = error_code;    }    public String getResultcode() {        return resultcode;    }    public String getReason() {        return reason;    }    public ResultEntity getResult() {        return result;    }    public int getError_code() {        return error_code;    }    public static class ResultEntity {        /**         * temp : 18         * wind_direction : 东南风         * wind_strength : 2级         * humidity : 41%         * time : 14:32         */        private SkEntity sk;        /**         * temperature : 8℃~17℃         * weather : 多云         * weather_id : {"fa":"01","fb":"01"}         * wind : 东南风3-4 级         * week : 星期三         * city : 苏州         * date_y : 2016年03月02日         * dressing_index : 较冷         * dressing_advice : 建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。         * uv_index : 弱         * comfort_index :         * wash_index : 较适宜         * travel_index : 较适宜         * exercise_index : 较适宜         * drying_index :         */        private TodayEntity today;        /**         * temperature : 8℃~17℃         * weather : 多云         * weather_id : {"fa":"01","fb":"01"}         * wind : 东南风3-4 级         * week : 星期三         * date : 20160302         */        private List future;        public void setSk(SkEntity sk) {            this.sk = sk;        }        public void setToday(TodayEntity today) {            this.today = today;        }        public void setFuture(List future) {            this.future = future;        }        public SkEntity getSk() {            return sk;        }        public TodayEntity getToday() {            return today;        }        public List getFuture() {            return future;        }        public static class SkEntity {            private String temp;            private String wind_direction;            private String wind_strength;            private String humidity;            private String time;            public void setTemp(String temp) {                this.temp = temp;            }            public void setWind_direction(String wind_direction) {                this.wind_direction = wind_direction;            }            public void setWind_strength(String wind_strength) {                this.wind_strength = wind_strength;            }            public void setHumidity(String humidity) {                this.humidity = humidity;            }            public void setTime(String time) {                this.time = time;            }            public String getTemp() {                return temp;            }            public String getWind_direction() {                return wind_direction;            }            public String getWind_strength() {                return wind_strength;            }            public String getHumidity() {                return humidity;            }            public String getTime() {                return time;            }            @Override            public String toString() {                return  +                         + temp + '\'' +                         + wind_direction + '\'' +                         + wind_strength + '\'' +                         + humidity + '\'' +                         + time + '\'' +                        '}';            }        }        public static class TodayEntity {            @Override            public String toString() {                return  +                         + temperature + '\'' +                         + weather + '\'' +                         + weather_id +                         + wind + '\'' +                         + week + '\'' +                         + city + '\'' +                         + date_y + '\'' +                         + dressing_index + '\'' +                         + dressing_advice + '\'' +                         + uv_index + '\'' +                         + comfort_index + '\'' +                         + wash_index + '\'' +                         + travel_index + '\'' +                         + exercise_index + '\'' +                         + drying_index + '\'' +                        '}';            }            private String temperature;            private String weather;            /**             * fa : 01             * fb : 01             */            private WeatherIdEntity weather_id;            private String wind;            private String week;            private String city;            private String date_y;            private String dressing_index;            private String dressing_advice;            private String uv_index;            private String comfort_index;            private String wash_index;            private String travel_index;            private String exercise_index;            private String drying_index;            public void setTemperature(String temperature) {                this.temperature = temperature;            }            public void setWeather(String weather) {                this.weather = weather;            }            public void setWeather_id(WeatherIdEntity weather_id) {                this.weather_id = weather_id;            }            public void setWind(String wind) {                this.wind = wind;            }            public void setWeek(String week) {                this.week = week;            }            public void setCity(String city) {                this.city = city;            }            public void setDate_y(String date_y) {                this.date_y = date_y;            }            public void setDressing_index(String dressing_index) {                this.dressing_index = dressing_index;            }            public void setDressing_advice(String dressing_advice) {                this.dressing_advice = dressing_advice;            }            public void setUv_index(String uv_index) {                this.uv_index = uv_index;            }            public void setComfort_index(String comfort_index) {                this.comfort_index = comfort_index;            }            public void setWash_index(String wash_index) {                this.wash_index = wash_index;            }            public void setTravel_index(String travel_index) {                this.travel_index = travel_index;            }            public void setExercise_index(String exercise_index) {                this.exercise_index = exercise_index;            }            public void setDrying_index(String drying_index) {                this.drying_index = drying_index;            }            public String getTemperature() {                return temperature;            }            public String getWeather() {                return weather;            }            public WeatherIdEntity getWeather_id() {                return weather_id;            }            public String getWind() {                return wind;            }            public String getWeek() {                return week;            }            public String getCity() {                return city;            }            public String getDate_y() {                return date_y;            }            public String getDressing_index() {                return dressing_index;            }            public String getDressing_advice() {                return dressing_advice;            }            public String getUv_index() {                return uv_index;            }            public String getComfort_index() {                return comfort_index;            }            public String getWash_index() {                return wash_index;            }            public String getTravel_index() {                return travel_index;            }            public String getExercise_index() {                return exercise_index;            }            public String getDrying_index() {                return drying_index;            }            public static class WeatherIdEntity {                private String fa;                private String fb;                public void setFa(String fa) {                    this.fa = fa;                }                public void setFb(String fb) {                    this.fb = fb;                }                public String getFa() {                    return fa;                }                public String getFb() {                    return fb;                }            }        }        public static class FutureEntity {            private String temperature;            private String weather;            /**             * fa : 01             * fb : 01             */            private WeatherIdEntity weather_id;            private String wind;            private String week;            private String date;            public void setTemperature(String temperature) {                this.temperature = temperature;            }            public void setWeather(String weather) {                this.weather = weather;            }            public void setWeather_id(WeatherIdEntity weather_id) {                this.weather_id = weather_id;            }            public void setWind(String wind) {                this.wind = wind;            }            public void setWeek(String week) {                this.week = week;            }            public void setDate(String date) {                this.date = date;            }            public String getTemperature() {                return temperature;            }            public String getWeather() {                return weather;            }            public WeatherIdEntity getWeather_id() {                return weather_id;            }            public String getWind() {                return wind;            }            public String getWeek() {                return week;            }            public String getDate() {                return date;            }            public static class WeatherIdEntity {                private String fa;                private String fb;                public void setFa(String fa) {                    this.fa = fa;                }                public void setFb(String fb) {                    this.fb = fb;                }                public String getFa() {                    return fa;                }                public String getFb() {                    return fb;                }                @Override                public String toString() {                    return  +                             + fa + '\'' +                             + fb + '\'' +                            '}';                }            }            @Override            public String toString() {                return  +                         + temperature + '\'' +                         + weather + '\'' +                         + weather_id +                         + wind + '\'' +                         + week + '\'' +                         + date + '\'' +                        '}';            }        }        @Override        public String toString() {            return  +                     + sk +                     + today +                     + future +                    '}';        }    }    @Override    public String toString() {        return  +                 + resultcode + '\'' +                 + reason + '\'' +                 + result +                 + error_code +                '}';    }}

总结

最后总结一下,通过使用mvp对代码进行分层之后,模块化更加的清楚,假如要换网络框架,需要修改model层和api层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。

代码的下载地址

代码的运行效果:

这里写图片描述

欢迎大家查看。如果有问题直接回复。

0 0
原创粉丝点击