MVP模型加载网络数据的页面展示
1.首先导入所需依赖包
2.创建三个包M层:model V层:view P层:presenter
在model中创建一个bean包和一个service包,在bean包中创建实体类,在service包中创建ApiService接口
代码如下:
package com.example.administrator.day11_mvp.model.service;
import com.example.administrator.day11_mvp.model.bean.DataInfos;
import io.reactivex.Observable;
import retrofit2.http.GET;
/**
* Created by Administrator on 2019/10/9 0009.
*/
public interface ApiService {
@GET("nc/article/list/T1349837698345/0-20.html")
Observable requestDataInfos();
}
3.在model层中创建MainModel类进行网络请求
代码如下:
package com.example.administrator.day11_mvp.model;
import com.example.administrator.day11_mvp.model.bean.DataInfos;
import com.example.administrator.day11_mvp.model.service.ApiService;
import org.reactivestreams.Subscriber;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by Administrator on 2019/10/9 0009.
*/
public class MainModel {
private ListmDisposableList =new ArrayList<>();
public void dispose(){
for (Disposable disposable :mDisposableList) {
disposable.dispose();
}
}
public void requestDataInfos(final MainCallBack mainCallBack){
Retrofit retrofit =new Retrofit.Builder()
.baseUrl("http://c.m.163.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
ApiService service = retrofit.create(ApiService.class);
Observable observable = service.requestDataInfos();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable disposable) {
}
@Override
public void onNext(DataInfos dataInfos) {
if (mainCallBack!=null){
if (dataInfos!=null){
mainCallBack.onRequestSuccess(dataInfos);
}
}
}
@Override
public void onError(Throwable e) {
if (mainCallBack!=null){
if (e!=null){
mainCallBack.onRequestFiulure(e);
}
}
}
@Override
public void onComplete() {
for (Disposable disposable :mDisposableList) {
disposable.dispose();
}
}
});
}
}
4.在请求网络数据的时候需要创建一个MainCallBack接口,用来将M层的数据传递到P层
代码如下:
package com.example.administrator.day11_mvp.model;
import com.example.administrator.day11_mvp.model.bean.DataInfos;
/**
* Created by Administrator on 2019/10/9 0009.
*/
public interface MainCallBack {
void onRequestSuccess(DataInfos dataInfos);
void onRequestFiulure(Throwable e);
}
5.在Presenter中创建MainPresenter类,用来接收P层传递的数据
代码如下:
package com.example.administrator.day11_mvp.presenter;
import com.example.administrator.day11_mvp.model.MainCallBack;
import com.example.administrator.day11_mvp.model.MainModel;
import com.example.administrator.day11_mvp.model.bean.DataInfos;
import com.example.administrator.day11_mvp.view.MainView;
/**
* Created by Administrator on 2019/10/9 0009.
*/
public class MainPresenter {
private MainModelmMainModel;
private MainViewmMainView;
public MainPresenter() {
}
public void addView(MainView mainView){
mMainView = mainView;
}
public void removeView(){
mMainView =null;
}
public void requestDataInfos(){
mMainModel =new MainModel();
mMainModel.requestDataInfos(new MainCallBack() {
@Override
public void onRequestSuccess(DataInfos dataInfos) {
if (mMainView!=null){
if (dataInfos!=null){
mMainView.onRequestSuccess(dataInfos);
}
}
}
@Override
public void onRequestFiulure(Throwable e) {
if (mMainView!=null){
if (e!=null){
mMainView.onRequestFiulure(e);
}
}
}
});
}
public void dispose(){
mMainModel.dispose();
}
}
6.在V层创建MainView接口,利用接口回调机制,在activity中接受P层的数据
代码如下:
package com.example.administrator.day11_mvp.view.activity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.administrator.day11_mvp.R;
import com.example.administrator.day11_mvp.model.bean.DataInfos;
import com.example.administrator.day11_mvp.presenter.MainPresenter;
import com.example.administrator.day11_mvp.view.MainView;
import com.example.administrator.day11_mvp.view.adapter.MyRecyclerAdapter;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener;
import java.util.ArrayList;
public class MainActivityextends AppCompatActivityimplements MainView, OnRefreshLoadMoreListener {
private RecyclerViewmRecyclerView;
private MainPresentermMainPresenter;
private ArrayListmDataList;
private MyRecyclerAdaptermMyRecyclerAdapter;
@SuppressLint("HandlerLeak")
private HandlermHandler =new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what ==1) {
mMyRecyclerAdapter.notifyDataSetChanged();
}
}
};
private SmartRefreshLayoutmSmart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mMainPresenter =new MainPresenter();
mMainPresenter.addView(this);
mMainPresenter.requestDataInfos();
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mDataList =new ArrayList<>();
mMyRecyclerAdapter =new MyRecyclerAdapter(this,mDataList);
mRecyclerView.setAdapter(mMyRecyclerAdapter);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mSmart = (SmartRefreshLayout) findViewById(R.id.smart);
mSmart.setOnRefreshLoadMoreListener(this);
}
@Override
public void onRequestSuccess(DataInfos dataInfos) {
mDataList.addAll(dataInfos.getT1349837698345());
mHandler.sendEmptyMessage(1);
}
@Override
public void onRequestFiulure(Throwable e) {
}
@Override
protected void onDestroy() {
super.onDestroy();
mMainPresenter.removeView();
mMainPresenter.dispose();
}
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
mMainPresenter.requestDataInfos();
mSmart.autoLoadMore();
mSmart.finishLoadMore(true);
}
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
mMainPresenter.requestDataInfos();
mSmart.autoRefresh();
mSmart.finishRefresh(true);
}
}