您的位置:首页 > 编程语言 > Java开发

使用MVP+Retrofit+rxjava让你的代码更简洁

2017-03-13 11:40 387 查看
上一篇文章[使用Retrofit和Rxjava让你的网络请求更简单](http://blog.csdn.net/yanglei0917/article/details/60964151),已经讲述了retrofit和rxjava的结合让你的网络请求变得不咋那么复杂,而且代码量清晰,高度解耦。在本篇文章中是继上一篇中的重构,因为mvp模式是当下解耦更加完全的模式,相比MVC更加简单好用


下面看看什么是mvp:

View:对应Activity,负责View的显示绘制以及用户的交互

Model:业务逻辑和实体模型

Presenter:负责完成View与Model之间的交互



下面看看我的代码结构:




其中的Model ,adapter和api中的代码没有变化还是上一篇文章的代码,这里新添加了presenter以及其实现类impl包,View包,重构了上一篇的代码

下面就是mvp实现的过程了,首先要创建一个View包,在创建一个接口类和他对应的activity同名,这里我们叫MainView,下面看看MainView的代码吧


package ledon.com.retrofitdemo.view;

import java.util.List;

import ledon.com.retrofitdemo.MovieBean;

/**
* Created by Administrator on 2017/3/13.
*/

public interface MainView {
void onClickGetMovie(List<MovieBean.SubjectsBean>list,boolean success);
}


接下来就看一看我们的presenter层的实现了,MainPersenter的接口:


package ledon.com.retrofitdemo.presenter;

/**
* Created by Administrator on 2017/3/13.
*/

public interface MainPresenter {
void clickGetMovie();
}


接下来看看presenter的实现类MainPresenterImpl,这个类要实现MainPresenter接口,具体实现代码如下:


package ledon.com.retrofitdemo.presenter.impl;

import android.widget.Toast;

import java.util.List;

import ledon.com.retrofitdemo.MainActivity;
import ledon.com.retrofitdemo.MovieBean;
import ledon.com.retrofitdemo.adapter.MovieAdapter;
import ledon.com.retrofitdemo.api.HttpMethods;
import ledon.com.retrofitdemo.presenter.MainPresenter;
import ledon.com.retrofitdemo.view.MainView;
import rx.Subscriber;

/**
* Created by Administrator on 2017/3/13.
*/

public class MainPresenterImpl implements MainPresenter {
private MainView mainView;
private Subscriber<MovieBean> subscriber;
private List<MovieBean.SubjectsBean> list;

public MainPresenterImpl(MainView mainView) {
this.mainView = mainView;

}

@Override
public void clickGetMovie() {
getMovie();
}

/**
* 获取电影的列表
*/
private void getMovie() {
subscriber = new Subscriber<MovieBean>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

mainView.onClickGetMovie(null,false);
}

@Override
public void onNext(MovieBean movieBean) {
list = movieBean.getSubjects();
//把集合传到Activity 让listview显示出来
mainView.onClickGetMovie(list,true);

}
};
HttpMethods.getInstance().getTopMovie(subscriber, 0, 10);
}
}


最后我们看一下我们重构的MainActivity了,我们要在里边实现MainView这个接口,在onCreate里边 new 出来这个实体presenter = new MainPresenterImpl(this);当我们点击获取网络数据的按钮的时候,在onclick中添加presenter.clickGetMovie();

下面我们看一下最终的实现了:


package ledon.com.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import ledon.com.retrofitdemo.adapter.MovieAdapter;
import ledon.com.retrofitdemo.api.HttpMethods;
import ledon.com.retrofitdemo.presenter.MainPresenter;
import ledon.com.retrofitdemo.presenter.impl.MainPresenterImpl;
import ledon.com.retrofitdemo.view.MainView;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity implements MainView{

@Bind(R.id.click_me_BN)
Button clickMeBN;
@Bind(R.id.result_TV)
ListView resultTV;
@Bind(R.id.activity_main)
RelativeLayout activityMain;
private MainPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);

presenter = new MainPresenterImpl(this);

}

/**
* 点击获取网络数据
*/
@OnClick(R.id.click_me_BN)
public void onClick() {
presenter.clickGetMovie();
}

/**
* 利用mvp模式来判断是否网络请求成功
* @param list
* @param success
*/
@Override
public void onClickGetMovie(List<MovieBean.SubjectsBean> list, boolean success) {
if (success){
MovieAdapter movieAdapter = new MovieAdapter(MainActivity.this, list);
resultTV.setAdapter(movieAdapter);
}else{
Toast.makeText(this,"请求失败",Toast.LENGTH_SHORT).show();
}

}
}


经过漫长的重构,我们的MVP+Retrofit+Rxjava框架实现了漫长的筹够过程,下面我们就看一看最后的效果吧






到这里我们已经成功的完成了所有的重构了,欢迎大家给出指导意见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvp 网络 重构