Android中的RxJava,Retrofit,MVP的使用
2016-04-25 01:03
519 查看
RxJava,Retrofit,MVP都是近几年讨论的比较热门的话题,我们也来凑个热闹!
本博不展开讨论,分别讨论的文章有很多,后续有时间给出RxJava,Retrofit的源码分析
先来说一下MVP(Model View Presenter)熟悉MVC结构的应该很容易理解MVP,这里先给出MVP的图解
model具体业务逻辑处理的实现
view负责显示数据、提供友好界面跟用户交互
presenter负责完成View于Model间的交互
下面给出一个使用这三者的demo,由于使用Retrofit和RxJava,数据获取的过程变得很简洁,此demo没有按照严格的MVP结构,遵从了数据和view分开处理的原则,降低了代码的耦合度,少定义几个接口
View代码层
写的比较简单,根据需求私人私人定制
view层的接口
present层代码
present层的接口
model层主要是实体,省略一百行代码…
RxJava使用
retrofit的使用
欲知详情,请听下回解说
Demo地址:https://github.com/zimoguo/MVPDemo
本博不展开讨论,分别讨论的文章有很多,后续有时间给出RxJava,Retrofit的源码分析
先来说一下MVP(Model View Presenter)熟悉MVC结构的应该很容易理解MVP,这里先给出MVP的图解
model具体业务逻辑处理的实现
view负责显示数据、提供友好界面跟用户交互
presenter负责完成View于Model间的交互
下面给出一个使用这三者的demo,由于使用Retrofit和RxJava,数据获取的过程变得很简洁,此demo没有按照严格的MVP结构,遵从了数据和view分开处理的原则,降低了代码的耦合度,少定义几个接口
View代码层
package com.zimo.guo.activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import com.zimo.guo.R; import com.zimo.guo.model.BannerVO; import com.zimo.guo.presenter.BannerPresenter; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements LoadingBannerView{ @Bind(R.id.show_banner_string) TextView showBanner; BannerPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); presenter = new BannerPresenter(MainActivity.this); presenter.loadData(); } @Override public void showData(List<BannerVO> bannerVOs) { showBanner.setText(bannerVOs.get(0).getPicUrl()); } @Override public void showNetworkErrorView() { } @Override public void hideNetworkErrorView() { } @Override public void showLoading() { } @Override public void hideLoading() { } @Override public void showEmptyView() { } @Override public void hideEmptyView() { } @Override public void showError(String message) { } }
写的比较简单,根据需求私人私人定制
view层的接口
package com.zimo.guo.activity; import com.zimo.guo.model.BannerVO; import java.util.List; /** * @Description: * @author: zimo * @date: 2016-04-25 */ public interface LoadingBannerView extends LoadingDataView{ void showData(List<BannerVO> bannerVOs); }
package com.zimo.guo.activity; import java.util.List; /** * @Description: 加载数据 * @author: zimo * @date: 2016-04-06 */ public interface LoadingDataView { void showNetworkErrorView(); void hideNetworkErrorView(); void showLoading(); void hideLoading(); void showEmptyView(); void hideEmptyView(); void showError(String message); }
present层代码
package com.zimo.guo.presenter; import com.zimo.guo.activity.LoadingBannerView; import com.zimo.guo.exception.NetworkConnectionException; import com.zimo.guo.model.BannerVO; import com.zimo.guo.network.service.HttpService; import com.zimo.guo.rx.operator.OperatorRequestMap; import java.util.List; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * @Description: * @author: zimo * @date: 2016-04-25 */ public class BannerPresenter implements CommonPresenter { LoadingBannerView view; public BannerPresenter(LoadingBannerView view) { this.view = view; } @Override public void loadData() { HttpService.getInstance().getCommonApi().getBannerList("", "", "", "") .lift(new OperatorRequestMap<List<BannerVO>>()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<BannerVO>>() { @Override public void call(List<BannerVO> bannerVOs) { if (bannerVOs != null && bannerVOs.size() > 0) { view.showData(bannerVOs); }else { view.showEmptyView(); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { if (throwable instanceof NetworkConnectionException) { view.showNetworkErrorView(); } } }); } }
present层的接口
package com.zimo.guo.presenter; /** * @Description: * @author: zimo * @date: 2016-04-25 */ public interface CommonPresenter { void loadData(); }
model层主要是实体,省略一百行代码…
RxJava使用
package com.zimo.guo.network.service; import com.zimo.guo.BuildConfig; import com.zimo.guo.constants.HttpContants; import com.zimo.guo.network.api.CommonApi; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * @Description: http * @author: zimo * @date: 2016-04-24 */ public class HttpService { private CommonApi commonApi; private HttpService() { Retrofit.Builder builder = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(HttpContants.DEFAULT_HOST_URL); OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request newReq = request.newBuilder() .build(); return chain.proceed(newReq); } }); if (BuildConfig.DEBUG){ HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); okHttpBuilder.addInterceptor(loggingInterceptor); } OkHttpClient client = okHttpBuilder.build(); builder.client(client); commonApi = builder.build().create(CommonApi.class); } private static class HttpServiceHandler{ public static final HttpService INSTANCE = new HttpService(); } public static HttpService getInstance(){ return HttpServiceHandler.INSTANCE; } public static CommonApi getCommonApi() { return HttpService.getInstance().commonApi; } }
retrofit的使用
package com.zimo.guo.network.api; import com.zimo.guo.model.BannerVO; import com.zimo.guo.model.BaseBean; import java.util.List; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; import rx.Observable; /** * @Description: * @author: zimo * @date: 2016-04-24 */ public interface CommonApi { @FormUrlEncoded @POST("") Observable<BaseBean<List<BannerVO>>> getBannerList(@Field("") String method, @Field("") String bannerUpdateVer, @Field("") String sessionKey, @Field("") String bannerType); }
欲知详情,请听下回解说
Demo地址:https://github.com/zimoguo/MVPDemo
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories