上一篇文章[使用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框架实现了漫长的筹够过程,下面我们就看一看最后的效果吧
到这里我们已经成功的完成了所有的重构了,欢迎大家给出指导意见!