mvp的实例:
v层的接口:
import com.honey.mvp.entity.News;
import java.util.List;
public interface HomeView {
//展示数据 v层负责展示数据
void showListData(List<News.ResultBean.DataBean> list);
}
现在是p层的接口:
/**
* presenter层接口 p层的副接口
*/
public interface IHomePretsenter<T> {
//T为泛型 相当于object
void attach(T view);//绑定
void detach();//解绑
}
和p层的实例用法:
import android.util.Log;
import com.honey.mvp.entity.News;
import com.honey.mvp.model.HomeModel;
import com.honey.mvp.model.IHomeModel;
import com.honey.mvp.view.HomeView;
import java.lang.ref.WeakReference;
import java.util.List;
/**
* p层 让m层与v层交互 p层负责处理逻辑
*/
public class HomePresenter implements IHomePretsenter<HomeView>{
//HomeView view;
IHomeModel model;
//双层保证 不会出现内存泄漏
//1、软引用 在内存不足时会回收 如果Activity意外终止 使用该方式能保证
WeakReference<HomeView> mRefView;
//2、通过手动的方式直接释放 activity销毁时直接回收
public HomePresenter(HomeView view) {
this.model = new HomeModel();
attach(view);
}
//进行和View层的绑定 activity
@Override
public void attach(HomeView view) {
mRefView = new WeakReference(view);
}
//解绑
@Override
public void detach() {
mRefView.clear();
Log.i("======", "detach: " + "解绑");
}
//提供的一个 让model数据加载在view上的方法
public void getData(){
model.loadData(new IHomeModel.HomeDataCallback() {
@Override
public void complete(List<News.ResultBean.DataBean> list) {
System.out.println("======list"+list);
mRefView.get().showListData(list);
}
});
}
}
现在m层的接口:
import com.honey.mvp.entity.News;
import java.util.List;
public interface IHomeModel {
void loadData(HomeDataCallback callback);//加载数据
//回调接口
interface HomeDataCallback{
void complete(List<News.ResultBean.DataBean> list);
}
}
接下来就是m层的实例:
import com.google.gson.Gson;
import com.honey.mvp.app.App;
import com.honey.mvp.entity.News;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
import xp.code.okhttp3.utils.OkHttp3Utils;
/**
* m层 负责请求数据
*/
public class HomeModel implements IHomeModel{
@Override
public void loadData(final HomeDataCallback callback) {
// List list=new ArrayList();
// for(int i=0;i<100;i++){
// list.add("你好"+i);
// }
// //回调model成中的接口
// callback.complete(list);
OkHttp3Utils.doGet(App.URL, null, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
System.out.println("======string"+string);
Gson gson=new Gson();
News news = gson.fromJson(string, News.class);
List<News.ResultBean.DataBean> data = news.getResult().getData();
callback.complete(data);
}
});
}
}
接下来就是MainActivity中的代码了:
import android.os.Bundle;
import android.widget.ListView;
import com.honey.mvp.adapter.MyAdapter;
import com.honey.mvp.entity.News;
import com.honey.mvp.presenter.HomePresenter;
import com.honey.mvp.view.HomeView;
import java.util.List;
public class MainActivity extends BaseActivity<HomePresenter> implements HomeView{
private ListView listView;
private HomePresenter presenter;//p层
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化空件
initView();
presenter.getData();
}
//是由BaseActvity提供 在BaseActivity的onCreate方法中调用
@Override
public void createPresenter() {
presenter = new HomePresenter(this);
}
/**
* 获取控件
*/
public void initView() {
listView=findViewById(R.id.listView);
}
//由View接口提供的方法 使用Model给的数据进行展示
@Override
public void showListData(List<News.ResultBean.DataBean> list) {
System.out.println("======list"+list.size());
MyAdapter adapter=new MyAdapter(MainActivity.this,list);
listView.setAdapter(adapter);
}
}
因为我们用实现的是BaseActivity,所以我们再来写一个BaseActivity的用法:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.honey.mvp.presenter.IHomePretsenter;
public abstract class BaseActivity<T extends IHomePretsenter> extends AppCompatActivity{
//使用范型定义个Presenter对象 该范型必须满足IPresenter类型 所以使用<T extends IPresenter>
T presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createPresenter();
initView();
}
public abstract void createPresenter();
public abstract void initView();
//让所有的Activity销毁时 统一在Base中进行和Presenter解绑
@Override
protected void onDestroy() {
super.onDestroy();
if(presenter != null){
presenter.detach();
}
}
}
因为我们请求的是网上的数据,所以根据习惯我们会用OKhttp来获取,要用到bean类,app,适配器,这里就不一一列举了,以上就是基本的mvp的用法了。