一.首先需要导入依赖包
在Module的build.gradle下:
//butterknife的依赖
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
//retrofit2依赖
compile 'com.android.support:design:23.4.0'
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.android.support:mediarouter-v7:25.0.0'
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:recyclerview-v7:25.0.0'
//fresco
compile 'com.facebook.fresco:fresco:0.12.0'
用MVP模式简单分个包
二.V层
1.定义一个接口IView
/**
*
* 在View中定义一个接口
*
* (定义一个得到数据的方法)
*/
public interface IView {
//得到P层的网络请求数据
void getUser(ArrayList<NewsBean.NewslistBean> list);
}
2.在Fragment或Activity中实现IView接口
/**
* Fragment1是View的实现类
* userModel.getJson(url,page,num);//post请求
*
* 负责显示
*/
public class Fragment1 extends Fragment implements IView {
//声明变量
@BindView(R.id.id_recyclerview)
RecyclerView mRecyclerView;
Unbinder unbinder;
private List<NewsBean.NewslistBean> newslist;
private String name;
UserPresenter userPresenter; //实例化P层
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取从实例化时传过来的值
Bundle bundle = getArguments();
if (bundle != null) {
name = bundle.get("name").toString();
Log.d("MyFragment", name);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.one_fragment, null);
//实例化P层,参数类型是IView
userPresenter = new UserPresenter(this);
//判断Fragment在哪一页
if (name.equals("a")) {
userPresenter.getUrl(API.PATH1);//P层中网络请求的方法
} else if (name.equals("b")) {
userPresenter.getUrl(API.PATH2);
} else if (name.equals("c")) {
userPresenter.getUrl(API.PATH3);
} else if (name.equals("d")) {
userPresenter.getUrl(API.PATH4);
}
unbinder = ButterKnife.bind(this, view);
return view;
}
//Fragment的实例(复用功能)
public static Fragment1 newInstance(String name) {
Bundle args = new Bundle();
args.putString("name", name);
Fragment1 fragment = new Fragment1();
fragment.setArguments(args);
return fragment;
}
//把数据和适配器关联起来
@Override
public void getUser(ArrayList<NewsBean.NewslistBean> list) {
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setAdapter(new HomeAdapter(getActivity(), list));
}
//ButterKnife
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
三.M层(负责做业务处理,耗时操作)
1.定义一个M层的接口
/**
*
* Model中定义一个接口
*
* 定义一个解析数据的方法(传入url路径)
*/
public interface IModel {
void getJson(String url);
void getJsonPost(String url,String num,String page);
}
2.实现IModel
/**
*
*IModel的实现类,用来处理耗时操作
*
*
*/
public class UserModel implements IModel {
ArrayList<NewsBean.NewslistBean> list=new ArrayList<>();
private OnFinishLisenter lisenter;
/*
* 定义一个公开的接口,可以写成外部接口
*
* */
public interface OnFinishLisenter{
//得到数据
void OnFinish(ArrayList<NewsBean.NewslistBean> list);
}
public void setOnUserModel(OnFinishLisenter lisenter) {
this.lisenter = lisenter;
}
/*
* 重写IModel中 请求数据的方法 get请求
* */
@Override
public void getJson(String url) {
//创建Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
ApiService apiService = retrofit.create(ApiService.class);
//得到Observable
Observable<NewsBean> observable = apiService.getNoParams();//获取数据源
observable.subscribeOn(Schedulers.io())//IO线程做耗时操作
.observeOn(AndroidSchedulers.mainThread())//在主线程更新UI
.subscribe(new Observer<NewsBean>() {//实例化一个观察者
//完成
@Override
public void onCompleted() {
}
//异常
@Override
public void onError(Throwable e) {
}
// 加载中
@Override
public void onNext(NewsBean news) {
list = (ArrayList<NewsBean.NewslistBean>) news.getNewslist();
//把数据通过这个方法传入P层
lisenter.OnFinish(list);
}
});
}
}
/*
*Post请求
*
*/
@Override
public void getJsonPost(String url,String page,String num) {
Map<String,String> map=new HashMap<>();
map.put("key","8d6e3228d25298f13af4fc40ce6c9679");
map.put("num",num);
map.put("page",page);
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
ApiService apiService = retrofit.create(ApiService.class);
Observable<NewsBean> postpages = apiService.getPost(url,map);
postpages.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<NewsBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(NewsBean pageBean) {
Log.d("MainActivity", "onNext: "+pageBean.getCode());
lisenter.OnFinish((ArrayList<NewsBean.NewslistBean>) pageBean.getNewslist());
}
});
}
四.P层
/**
* P层 建立M和V之间的关系
*
*/
public class UserPresenter implements UserModel.OnFinishLisenter {
private final IView userView; //V中的接口
private final UserModel userModel;//M中的实现类
//通过有参构造将M中的数据传入V中
public UserPresenter(IView userView) {
this.userView = userView;
this.userModel = new UserModel();//实例化Module
userModel.setOnUserModel(this); //这句话重点
}
public void getUrl(String url) {
//得到Model中请求数据的方法
userModel.getJson(url);
userModel.getJsonPost(url,page,num);
}
@Override
public void OnFinish(ArrayList<NewsBean.NewslistBean> list) {
//把从M层中传过来的数据通过以下的方法传到V层中
userView.getUser(list);
}
}
五.结合Retrofit+RxJava
/**
*
* 创建 接收服务器返回数据 的类
*/
public interface ApiService {
/**
* 结合Retrofit+RxJava
* @param
* @return
*/
@GET("?key=691dce141baf9b719db22f6382ba5639&num=10")
//返回类型是被观察者
Observable<NewsBean> getNoParams();
/**
*
*
* post请求
*/
@POST
Observable<NewsBean> getPost(@Url String url,@QueryMap Map<String,String> map);
}