封了一個Android MVP框架炮赦,就叫XMVP吧怜跑!

簡介

由于找工作沒有找到,寫了一個練手項目(還在開發(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)代碼甘耿。

  1. 初始化在onInit()進行
  2. 監(jiān)聽在onListener()進行
  3. 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 {

    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毁葱,一起剝皮案震驚了整個濱河市垫言,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倾剿,老刑警劉巖筷频,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異前痘,居然都是意外死亡凛捏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門芹缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坯癣,“玉大人,你說我怎么就攤上這事乖菱∑挛” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵窒所,是天一觀的道長鹉勒。 經(jīng)常有香客問我,道長吵取,這世上最難降的妖魔是什么禽额? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮皮官,結(jié)果婚禮上脯倒,老公的妹妹穿的比我還像新娘。我一直安慰自己捺氢,他們只是感情好藻丢,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摄乒,像睡著了一般悠反。 火紅的嫁衣襯著肌膚如雪残黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天斋否,我揣著相機與錄音梨水,去河邊找鬼。 笑死茵臭,一個胖子當(dāng)著我的面吹牛疫诽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旦委,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼奇徒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了社证?” 一聲冷哼從身側(cè)響起逼龟,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤评凝,失蹤者是張志新(化名)和其女友劉穎追葡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奕短,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宜肉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翎碑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬返。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖日杈,靈堂內(nèi)的尸體忽然破棺而出遣铝,到底是詐尸還是另有隱情,我是刑警寧澤莉擒,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布酿炸,位于F島的核電站,受9級特大地震影響涨冀,放射性物質(zhì)發(fā)生泄漏填硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一鹿鳖、第九天 我趴在偏房一處隱蔽的房頂上張望扁眯。 院中可真熱鬧,春花似錦翅帜、人聲如沸姻檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绣版。三九已至周荐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僵娃,已是汗流浹背概作。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留默怨,地道東北人讯榕。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像匙睹,于是被迫代替她去往敵國和親愚屁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容