一、前言
MVP模式是当前比较主流的框架,主要是由它的优点来决定的吧。本文结合了MVP+Retrofit+RxJava三大主流框架,一开始可能会觉得不容易理解,但是真正理解了之后,开发、维护就不是那么痛苦的事情了。
二、Demo介绍
2.1、需要具备哪些知识
读这篇文章之前,你需要了解的知识有:
1、MVP【点这里看百度百科介绍】
2、Retrofit 2.0
3、RxJava(点击这里看—不错的一个Retrofit+RxJava结合的例子)
4、Butterknife的使用
5、状态栏一体化(android状态栏一体化)
6、CallBack回调思想(说白了就是:成功还是失败了,你总的告诉我一声,我好通知V层来处理[这里可以不用回调,在代码中使用EventBus或者传递一个Handler过来也可以,不建议这样操作])
2.2、优势
1、MVP 高度解耦 提高代码质量
2、Retrofit+RxJava最强的网络访问组合
3、功能易扩展 易维护 易测试
2.3、MVP浅析
1)、MVP的优点:
1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)【以上优点参考了百度百科的“MVP模式“】
三.下面进行一下代码的展示
1.1首先添加一些依赖
compile'com.squareup.retrofit2:retrofit:2.0.2'
// Retrofit库
compile'com.squareup.okhttp3:okhttp:3.1.2'
// Okhttp库
compile'com.squareup.retrofit2:converter-gson:2.0.2'
compile'io.reactivex:rxjava:1.0.14'
compile'io.reactivex:rxandroid:1.0.1'
compile'com.squareup.retrofit2:adapter-rxjava:2.0.2'
1.2一定不要忘记添加联网权限,否则会报错
1.3代码的展示
先进行分包,model,presenter,view,再建一个工具类和api类
NetWorkUtils类,工具类,前面是一个单例模式
private NetWorkUtils(){
}
private static MyApi api;
public static MyApi getapi(){
if(api==null){
synchronized(NetWorkUtils.class){
if(api==null){
OkHttpClient client=new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(MyApi.URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
api=retrofit.create(MyApi.class);
}
}
}
return api;
}
Api的类
public static final String URL="http://tingapi.ting.baidu.com/";
@GET("v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0")
Observable
getCall();
Model层的类
public void getShop(){
NetWorkUtils.getapi().getCall()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
System.out.println("====onCompleted===");
}
@Override
public void onError(Throwable e) {
System.out.println("====onError==="+e);
}
@Override
public void onNext(MyBean myBean) {
System.out.println("====onNext==="+myBean);
final List song_list = myBean.song_list;
onShop.getShopSuccess(song_list);
}
});
}
private OnShopon Shop;
public void setOnShop(OnShop onShop) {
this.onShop= onShop;
}
public interface OnShop{
void getShopSuccess(List song_list);
}
Presenter层的类
public class ShopPresenter implements IShopPresenter,ShopModel.OnShop {
private ShopView shopView;
private final ShopModel shopModel;
private SoftReference softReference;
public ShopPresenter(ShopView shopView) {
this.shopView= shopView;
shopModel=new ShopModel();
shopModel.setOnShop(this);
}
public void requestShop(){
shopModel.getShop();
}
@Override
public void Attech(ShopView view) {
softReference=new SoftReference(view);
System.out.println("===attech===="+"绑定");
}
@Override
public void Detech() {
System.out.println("===detech==="+"解绑");
softReference.clear();
}
@Override
public void getShopSuccess(List song_list) {
shopView.getShopSuccess(song_list);
}
}
IShopPresenter类,用来进行解绑和绑定
public interface IShopPresenter {
void Attech(Tview);
void Detech();
}
View层是一个接口,
public interface ShopView {
void getShopSuccess(List song_list);
}
BaseActivity的类,Activity的基类,在这个类中重写Oncreate方法时,要选择带有一个参数的,不然会出现问题,本人在这个地方已经吃过一次梗了.
public abstract class BaseActivity extends AppCompatActivity{
T mPresenter;
@Override
protected void onCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
createPresenter();
}
public abstract void createPresenter();
@Override
protected voidon Destroy() {
super.onDestroy();
mPresenter.Detech();
}
}
最后在MainActivity中进行操作.
public class MainActivity extends BaseActivity implements ShopView {
@BindView(R.id.rlv)
RecyclerView rlv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mPresenter.requestShop();
}
@Override
public void createPresenter() {
mPresenter=new ShopPresenter(this);
}
@Override
public void getShopSuccess(finalList song_list) {
LinearLayoutManager linearLayoutManager=newLinearLayoutManager(MainActivity.this);
rlv.setLayoutManager(linearLayoutManager);
MyAdapter ma=new MyAdapter(MainActivity.this,song_list);
rlv.setAdapter(ma);
}
}
好了,这就是一套简单的结合使用.
希望可以帮助到您!