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
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android RxJava+Retrofit2.0+MVP模式整合
- Android RxJava+Retrofit2.0+MVP的小试牛刀
- Android——MVP+Retrofit2.0+RxJava框架整合
- Retrofit2.0+RxJava+MVP整合实践
- Android中MVP模式的内存泄漏解决及Retrofit2、RxJava中断网络请求(二)
- Retrofit2.0+RxJava+MVP+Bmob的使用
- Android中RxJava+Retrofit+MVP模式的整合(1)—目录设计
- MVP+Dagger2+Retrofit2.0+Rxjava
- android之dagger2+rxjava+retrofit2+mvp架构的结合
- 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器
- MVP模式+Dagger2+Rxjava+retrofit2+lambda表达式 … retrofit2带进度的上传下载
- owspace 是基于 MVP+Dagger2+Retrofit2.0+Rxjava 的 APP
- Android中okHttp+retrofit2.0+RxJava的使用
- 自己对MVP+Retrofit2+RxJava的理解
- MVP结合RxJava,Retrofit2.0初探索
- 使用hibernate连接mysql遇到的编码问题
- 贷款相关概念
- SAP Backgroud job
- jsp样式被覆盖,jsp调试的时候多了element.style
- 谈今天的我
- Android中RxJava+Retrofit2.0+MVP模式的整合
- 稳定灵活的 HTML 列式布局
- 词向量介绍
- js正则表达式验证大全
- HDOJ.1070 Milk(贪心)
- Android Retrofit 2.0框架上传图片解决方案(一张与多张的处理)
- Spring boot配置Junit
- Android 使用AIDL实现进程之间的通信(一)
- form表单元素类型