MVP模式获取数据
MVP与MVC的区别
MVP与MVC的最大区别就是Moudel层与View层不能直接通信,需要通过Presenter进行交互
其中
model层主要是获取网络请求下来的数据
Presenter层主要是用来进行逻辑操作,也是逻辑层
View层是视图层
各个层都要自定义接口进行使用
首先是Model的接口
public interface DataMoudle {
void getData(String url, DataPresenter presenter);
}
然后是model层的获取数据的操作
public class MyDataMoudle implements DataMoudle {
//请求数据的
@Override
public void getData(String url, final DataPresenter presenter) {
//请求数据
OkhtttpUtils.doGet(url, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//可以认为是请求成功
String json = response.body().string();
Gson gson = new Gson();
ShopingBean shopingBean = gson.fromJson(json, ShopingBean.class);
//得到数据,服务器的
List<ShopingBean.DataBean> list = shopingBean.getData();
//回调给p层
presenter.success(list);
}
});
}
}
使用OkHttpUtils工具类进行获取数据(见其他文章)
然后是Presenter层的接口
public interface DataPresenter {
void success(List<ShopingBean.DataBean> list);
void error();
}
写一个继承Presenter层接口的类重写其中的方法
并进行model与view二者之间的交互(将数据传到view层进行展示)
public class MyDataPresenter implements DataPresenter{
private final MyDataMoudle myDataMoudle;
DataView dataView;
public MyDataPresenter(DataView dataView){
this.dataView = dataView;
myDataMoudle = new MyDataMoudle();
}
//M层得到数据,传给p层 ,传给view 层
@Override
public void success(List<ShopingBean.DataBean> list) {
dataView.toBackHome(list);
}
@Override
public void error() {
}
//请求数据的方法
public void netWork(String dataUrl) {
myDataMoudle.getData(dataUrl,this);
}
}
接着是view层的接口
public interface DataView {
void toBackHome(List<ShopingBean.DataBean> list);
}
再写一个继承view层接口的类(不一定非要是Mainactivity)
public class MainActivity extends AppCompatActivity implements DataView{
String dataUrl ="https://www.zhaoapi.cn/product/getProducts?pscid=1";
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
List<ShopingBean.DataBean> list = (List<ShopingBean.DataBean>) msg.obj;
MyAdapter adapter = new MyAdapter(MainActivity.this,list);
lv.setAdapter(adapter);
}
};
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckBox cb = findViewById(R.id.cb);
lv = findViewById(R.id.lv);
//lv.setAdapter();
MyDataPresenter presenter = new MyDataPresenter(this);
presenter.netWork(dataUrl);
}
//子线程里面
@Override
public void toBackHome(List<ShopingBean.DataBean> list) {
Message msg = new Message();
msg.obj= list;
handler.sendMessage(msg);
}
}
设置适配器是必须在子线程中,所以用Handler设置适配器
在解析数据的类里的集合里面加上(注:博主工程所需,请忽略)
public void setCheck(boolean isCheck){
this.isCheck = isCheck;
}
public boolean getCheck(){
return isCheck;
}
其中用到的依赖和权限:
清单文件中的请求网络的权限,
Gson的依赖:compile 'com.google.code.gson:gson:2.2.4'
OkHttp请求的依赖: compile 'com.squareup.okhttp3:okhttp:3.10.0'
Glide设置图片的依赖: compile 'com.github.bumptech.glide:glide:3.7.0'
PS:MVP主要思路和格式是这样的,数据以自己获取的为准。