Android 簡單封裝一個MVP基類

對于MVP架構(gòu)我想大家都不陌生吧,對于現(xiàn)在的主流框架非MVP + RxJava + Retrofit莫屬了倡勇,GitHub上也有很多優(yōu)秀的開源項目對其進行了很好的封裝锭吨。有時候看一些優(yōu)秀的開源項目是一種享受纹冤,但自己如果能從這里學(xué)到并實現(xiàn)一些自己想實現(xiàn)的需求我想那更是一種享受雄可。這里很簡單的去實現(xiàn)一個MVP的基類,其它擴展功能可以自行添加蕴侣。

Model

public abstract class BaseModel {

}

Presenter

public abstract class BasePresenter<M,V> {

    public M mIModle;
    public V mIView;

    public void attachV(V v){
        this.mIView = v;
        if (mIModle == null) {
            mIModle = createModel();
        }
    }

    //當View被銷毀掉時刪除Presenter層對View層的引用
    public void detachV(){
        mIView = null;
    }

    public abstract M createModel();
}

View

public interface IBaseView {

}
@SuppressLint("Registered")
public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView{

    public P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (mPresenter == null) {
            mPresenter = createPresenter();
        }

        mPresenter.attachV(this);
    }


    //當View被銷毀掉時刪除Presenter層對View層的引用
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachV();
    }
    
    public abstract P createPresenter();

}

這里Mode和View的基類里什么都沒有焰轻,其實我們知道一般封裝基類的目錄是為了簡化項目代碼,提高開發(fā)效率昆雀。所以這里兩個基類里面一般根據(jù)我們自己需求去實現(xiàn)辱志。

Example

public interface ExampleDataSource {

    interface OnExampleFinishListener{
        void loading();
        void onSuccess();
        void onError();
    }

    void load(OnExampleFinishListener listener);
}

ExampleDataSource接口實現(xiàn)的是ExampleModel,而在它的內(nèi)部接口OnExampleFinishListener是Model層的回調(diào)接口,它們真正實現(xiàn)是在Presenter層狞膘。對于獲取到數(shù)據(jù)后(成功或失斂痢)就是通過這個回調(diào)接口將數(shù)據(jù)傳遞Presenter層。

public class ExampleModel extends BaseModel implements ExampleDataSource {
    /**
     * model層主要用來進行數(shù)據(jù)存儲操作挽封,例如:數(shù)據(jù)讀寫和網(wǎng)絡(luò)請求已球。
     * 這里進行下模擬耗時操作
     * @param listener
     */
    @Override
    public void load(final OnExampleFinishListener listener) {
        //加載中狀態(tài)
        listener.loading();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //獲取成功后進行回調(diào)
                listener.onSuccess();
            }
        },2000);
    }
}

這里我們在Model層模擬下耗時操作(例如:網(wǎng)絡(luò)請求),然后將得到的數(shù)據(jù)結(jié)果通過回調(diào)方法傳遞到Presenter層辅愿。

public interface ExampleContract extends IBaseView {

    interface ExamplePresent {
        void loadData();
    }

    interface ExampleView {
        void loadResult(String result);

        void showLoading();

        void loadFinish();
    }

}

這里我們將Presenter接口和View接口放在一個類中智亮,這樣可以使我們能夠清晰的看到在Presenter層和View層中有哪些功能,方便我們以后維護渠缕。

public class ExamplePresenter extends BasePresenter<ExampleModel,ExampleContract.ExampleView> implements ExampleContract.ExamplePresent,ExampleDataSource.OnExampleFinishListener{

    @Override
    public void loadData() {
        mIModle.load(this);
    }

    @Override
    public void loading() {
        mIView.showLoading();
    }

    @Override
    public void onSuccess() {
        mIView.loadResult("成功");
        mIView.loadFinish();
    }

    @Override
    public void onError() {

    }
    
    @Override
    public ExampleModel createModel() {
        return new ExampleModel();
    }
}

從Presenter層我們可以看出鸽素,首先調(diào)用Model層的接口獲取數(shù)據(jù)進行一些邏輯操作然后通過View層接口實現(xiàn)數(shù)據(jù)的展示。

public class MainActivity extends BaseMvpActivity<ExamplePresenter> implements ExampleContract.ExampleView {

    private TextView tvName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvName = findViewById(R.id.tv_name);
        //加載數(shù)據(jù)
        mPresenter.loadData();
    }

    @Override
    public ExamplePresenter createPresenter() {
        return new ExamplePresenter();
    }

    //返會數(shù)據(jù)結(jié)果
    @Override
    public void loadResult(String result) {
        tvName.setText(result);
    }

    //加載過程
    @Override
    public void showLoading() {
        tvName.setText("正在加載亦鳞,請稍等馍忽。。燕差。");
    }

    //加載結(jié)束
    @Override
    public void loadFinish() {

    }
}

嗯遭笋,好了!一個很簡單的MVP基類就實現(xiàn)了徒探,對于使用輪子來說瓦呼,我們更應(yīng)該試著一點點自己去實現(xiàn)它,從簡單到復(fù)雜测暗。慢慢就會更加的了解它央串。貼上項目源碼更參考。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碗啄,一起剝皮案震驚了整個濱河市质和,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稚字,老刑警劉巖饲宿,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦酬,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘫想,警方通過查閱死者的電腦和手機仗阅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国夜,“玉大人减噪,你說我怎么就攤上這事≈е瘢” “怎么了旋廷?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵鸠按,是天一觀的道長礼搁。 經(jīng)常有香客問我,道長目尖,這世上最難降的妖魔是什么馒吴? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮瑟曲,結(jié)果婚禮上饮戳,老公的妹妹穿的比我還像新娘。我一直安慰自己洞拨,他們只是感情好扯罐,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烦衣,像睡著了一般歹河。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上花吟,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天秸歧,我揣著相機與錄音,去河邊找鬼衅澈。 笑死键菱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的今布。 我是一名探鬼主播经备,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼部默!你這毒婦竟也來了侵蒙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤甩牺,失蹤者是張志新(化名)和其女友劉穎蘑志,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡急但,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年澎媒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片波桩。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡戒努,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镐躲,到底是詐尸還是另有隱情储玫,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布萤皂,位于F島的核電站撒穷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裆熙。R本人自食惡果不足惜端礼,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望入录。 院中可真熱鬧蛤奥,春花似錦、人聲如沸僚稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚀同。三九已至缅刽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唤崭,已是汗流浹背拷恨。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谢肾,地道東北人腕侄。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像芦疏,于是被迫代替她去往敵國和親冕杠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

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