关于MVP,已经不是什么新鲜的东西了,网上的教程也是一摞一摞的,我当初看的是焦头烂额,看了半天还是不知道怎么用。。。
现在就跟着我思路,来看看MVP到底怎么写,当然这之前你得知道什么是MVP。
Talk is cheap,Show you the code!
public interface IContract {
interface Model {
List<String> download();//下载数据;
void getData(OnGetDataLinstener getDataLinstener);//模拟网络获取数据
interface OnGetDataLinstener{
void successful(String s);//成功后的接口回调
void failed();//失败后的接口回调
}
}
interface View {
void setList(List<String> list);//给listview设置数据
void toast(String s);
}
interface Presenter {
void startDown();//开始下载数据
}
}
1.Presenter接口
Presenter 这个接口呢,主要是写业务逻辑的,将Model中产生的数据拿过来刷新View,所有的方法都是围绕这个主题建立的;
它的实现类是直接跟Activity接触的;
要注意它的实现类的有参构造方法内要放入View接口,并且在方法中new出Model的实现类;
public IPresenter(IContract.View iv) {
this.iv = iv;
m = new IModel();
}
在有参构造中放入View的接口是为了在new IPresenter的时候让Activity实现View接口的方法,从而实现刷新View的目的。
在IPresenter中从Model中的方法获取数据,然后刷新给View,就是具体的业务逻辑了
public class IPresenter implements IContract.Presenter, IContract.Model.OnGetDataLinstener {
IContract.View iv;
IContract.Model m;
public IPresenter(IContract.View iv) {
this.iv = iv;
m = new IModel();
}
@Override
public void startDown() {
List<String> download = m.download();//获取本地数据
iv.setList(download);//给View设置数据
m.getData(this);//获取网络数据,并实现回调接口
}
//成功之后的回调
@Override
public void successful(String s) {
Log.d("IPresenter", s);
iv.toast(s);
}
@Override
public void failed() {
}
}
2.Model接口
这个接口没啥好说的了,就是具体的一些获取数据的逻辑,注意写个回调接口获取数据就行了
public class IModel implements IContract.Model {
List<String> list = new ArrayList<>();
@Override
public List<String> download() {
//假设的本地数据
for (int i = 0; i < 100; i++) {
list.add(i + "");
}
return list;
}
@Override
public void getData(final OnGetDataLinstener getDataLinstener) {
OkGo.get("http://11.11.11.11:9099/api/Company/GetCompanyList") // 请求方式和请求url
.tag(this) // 请求的 tag, 主要用于取消对应的请求
.cacheKey("cacheKey") // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
.cacheMode(CacheMode.DEFAULT) // 缓存模式,详细请看缓存介绍
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
getDataLinstener.successful(s);//数据获取成功后的回调
}
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
getDataLinstener.failed();//获取数据失败后的回调
}
});
}
}
3.View接口
这个接口就是负责展示的逻辑,它没有实现类,因为它是在Activity中具体实现的
public class MainActivity extends AppCompatActivity implements IContract.View {
private ListView lv;
private List<String> strings;
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OkGo.init(getApplication());
initview();
IPresenter iPresenter = new IPresenter(this);
iPresenter.startDown();
}
private void initview() {
mTv = (TextView) findViewById(R.id.tv);
lv = (ListView) findViewById(R.id.lv);
}
@Override
public void setList(List<String> list) {
Log.d("MainActivity", "111:" + 111);
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, list);//适配器
lv.setAdapter(myAdapter);
}
@Override
public void toast(String s) {
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
mTv.setText(s);
}
}
Activity现在要做的就是两件事,首先你要new 一个IPresenter出来,然后findviewbyid就行了,其他的都交给Presenter就行了。