簡介
由于找工作沒有找到,寫了一個練手項目(還在開發(fā)中...)吠勘。用的MVP模式開發(fā)的性芬,想著以后還會用到,專門把這MVP的相關(guān)代碼提取出來當(dāng)一個類庫來使用剧防。
項目地址: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备埃,調(diào)用modle和view姓惑。
第二步:寫一個model來獲取數(shù)據(jù)(如果需要獲取數(shù)據(jù)的話)
例子:在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周期結(jié)束被調(diào)用乘寒。還有個end()方法在onDestroy周期被調(diào)用望众。
第四步:就是View怎么搞了
將MainPresenter作為泛型,在父類BaseActivity中已經(jīng)將MainPresenter實例化了,在MainActivity對象中可以直接使用presenter烂翰。比如在這里你可以:presenter.requestTextData()來獲取數(shù)據(jù)
例子:來看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的相關(guān)代碼甘耿。
- 初始化在onInit()進行
- 監(jiān)聽在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() {}
/**
* 這里面寫監(jiān)聽事件
*/
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;
}
/**
* 添加監(jiān)聽
*/
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接口什么都沒有,是為了創(chuàng)建Presenter佳恬。怎么創(chuàng)建的呢捏境?在GenericHelper里面!
public interface XContract {
interface Presenter {
}
interface View {
}
}