简介
由于找工作没有找到,写了一个练手项目(还在开发中...)。用的MVP模式开发的,想着以后还会用到,专门把这MVP的相关代码提取出来当一个类库来使用。
项目地址:https://github.com/xujiaji/HaiNaBaiChuan/tree/master
XMVPLibrary和example地址:https://github.com/xujiaji/XMVP
XMVPLibrary example apk下载,该APP可浏览xmvp和example代码哦
主要需要一个Presenter、View接口,MainPresenter引用的View接口,MainActivity直接引用的MainPresenter类。不用管MainPresenter的实例化在代码中通过的泛型实例化的MainPresenter。
看一下如何使用呢
添加依赖到项目build.gradle中
dependencies {
compile 'com.github.xujiaji:xmvp:0.0.4'
}
第一步:定义Contract
需要定义一个Contract,Contract接口中定义Presenter和View接口,它们分别继承XContract.Presenter和XContract.View。说不清楚了,还是看一下栗子吧!
public interface MainContract {
interface Presenter extends XContract.Presenter{
void requestTextData();
}
interface View extends XContract.View{
void showText(String text);
}
}
Presenter接口就是MVP中的P,调用modle和view。
第二步:写一个model来获取数据(如果需要获取数据的话)
例子:在example案例中的modle包中:DataFill.java
public class DataFill {
public static String getText() {
return "...." ;
}
}
第三步:Presenter实例
Presenter 需要继承XBasePresenter,用上面MainContract定义的View作为泛型,MainContract定义的Presenter接口。
例子:该例子为MainActivity的Presenter:MainPresenter
public class MainPresenter extends XBasePresenter<MainContract.View> implements MainContract.Presenter {
public MainPresenter(MainContract.View view) {
super(view);
}
@Override
public void start() {
super.start();
requestTextData();
}
@Override
public void requestTextData() {
String textData = DataFill.getText();
view.showText(textData);
}
}
父类中有个start()方法,在Activity的oncreate周期结束被调用。还有个end()方法在onDestroy周期被调用。
第四步:就是View怎么搞了
将MainPresenter作为泛型,在父类BaseActivity中已经将MainPresenter实例化了,在MainActivity对象中可以直接使用presenter。比如在这里你可以:presenter.requestTextData()来获取数据
例子:来看MainActivity
public class MainActivity extends XBaseActivity<MainPresenter> implements MainContract.View {
@BindView(R.id.tvText)
TextView tvText;
@Override
protected int getContentId() {
return R.layout.activity_main2;
}
@Override
public void showText(String text) {
tvText.setText(text);
}
}
这个XMVP到底咋个回事呢?
还是来看看代码
这是XBaseActivity,这里面直接写了ButterKnife的相关代码。
- 初始化在onInit()进行
- 监听在onListener()进行
- presenter的实例化
presenter = GenericHelper.initPresenter(this);
/**
* 项目中Activity的基类
*/
public abstract class XBaseActivity<T extends XBasePresenter> extends AppCompatActivity {
protected T presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
beforeSetContentView();
setContentView(getContentId());
ButterKnife.bind(this);
try{
presenter = GenericHelper.initPresenter(this);
}catch (Exception e) {
e.printStackTrace();
}
onInit();
onListener();
if (presenter != null) {
presenter.start();
}
}
/**
* 需要在SetContentView之前做的操作
*/
protected void beforeSetContentView() {
}
/**
* 在这里面进行初始化
*/
protected void onInit() {}
/**
* 这里面写监听事件
*/
protected void onListener() {}
/**
* 获取布局的id
* @return
*/
protected abstract int getContentId();
@Override
protected void onDestroy() {
super.onDestroy();
presenter.end();
}
}
这是XBaseFragment的代码,和上面差不多
/**
* 项目中Fragment的基类
*/
public abstract class XBaseFragment<T extends XBasePresenter> extends Fragment {
protected T presenter;
private View rootView;
private Unbinder unbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
try{
presenter = GenericHelper.initPresenter(this);
}catch (Exception e) {
e.printStackTrace();
}
rootView = inflater.inflate(getLayoutId(), container, false);
unbinder = ButterKnife.bind(this, rootView);
onInit();
onListener();
if (presenter != null) {
presenter.start();
}
return rootView;
}
/**
* 添加监听
*/
protected void onListener(){
}
protected abstract int getLayoutId();
/**
* 初始化控件
*/
protected void onInit(){}
public View getRootView() {
return this.rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
presenter.end();
unbinder.unbind();
}
}
这是BasePresenter的代码
public class XBasePresenter<T extends XContract.View> {
protected T view;
public BasePresenter(T view) {
this.view = view;
}
public void start() {}
public void end() {
view = null;
}
}
Contract代码
其实Contract里面的BasePresenter和BaseView接口什么都没有,是为了创建Presenter。怎么创建的呢?在GenericHelper里面!
public interface XContract {
interface Presenter {
}
interface View {
}
}