成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Android MVP 框架 Demo

hss01248 / 3117人閱讀

摘要:就是,控制器,這里負(fù)責(zé)的是與之間的聯(lián)系操作。咱們的就是中的層,而且職責(zé)明確,只負(fù)責(zé)處理的部分。數(shù)據(jù)請(qǐng)求前有個(gè)數(shù)據(jù)請(qǐng)求后有個(gè)這就是層控制層和層的作用了。

這個(gè)項(xiàng)目簡(jiǎn)單封裝了一個(gè)簡(jiǎn)單的MVP設(shè)計(jì)框架,根據(jù)框架可以很容易的在你自己的項(xiàng)目中實(shí)現(xiàn) MVP 設(shè)計(jì)模式。繼承我封裝好的 BaseActivity,BaseFragmentActivity,BaseSwipeRefreshActivity,BaseFragment,BaseSwipseRefreshFragment 可以很好的實(shí)現(xiàn) MVP 模式的項(xiàng)目開(kāi)發(fā)。
也許你知道 所謂的MVP 設(shè)計(jì)模式就是:

M就是Model ,這里主要負(fù)責(zé)的就是業(yè)務(wù)處理,數(shù)據(jù)的獲取,例如數(shù)據(jù)庫(kù)的讀寫(xiě),http的網(wǎng)絡(luò)數(shù)據(jù)的處理。
V就是View ,顧名思義視圖的意思,這里主要的任務(wù)就是處理各個(gè)界面ui控件的處理。
P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。

其實(shí)簡(jiǎn)單的用一句話描述就是:將View層抽象成view接口,將業(yè)務(wù)邏輯統(tǒng)統(tǒng)交給 Presenter 層去做。

也許還不太了解或是已經(jīng)了解的可以來(lái)看下面的 demo

下面的一個(gè) activity 需要完成的功能是

(1)顯示初始化數(shù)據(jù) list data
(2)下拉刷新能加載新數(shù)據(jù)
(3)數(shù)據(jù)加載成功,或出錯(cuò)做一些提示交互。

其實(shí)這些基本內(nèi)容是我們經(jīng)常和大量用到的一些場(chǎng)景。那來(lái)看看咱們?cè)趺蠢胢vp模式來(lái)分層實(shí)現(xiàn):
首先繼承我封裝好了的 BaseSwipeRefreshActivity ,并且 自己 實(shí)現(xiàn) MainPresenter 類(lèi) 和 IRefreshView 接口,那么 MainActivity 就可以實(shí)現(xiàn) 簡(jiǎn)單的 mvp 設(shè)計(jì)模式了。

先分析 MVP 中 V層的實(shí)現(xiàn),及 MainActivity 的實(shí)現(xiàn):

public class MainActivity extends BaseSwipeRefreshActivity implements IRefreshView {

    @Bind(R.id.toolbar)
    protected Toolbar mToolbar;

    @Bind(R.id.swipe_refresh_layout)
    protected SwipeRefreshLayout mSwipeRefreshLayout;

    @Bind(R.id.main_RecyclerView)
    RecyclerView main_RecyclerView;

    private DataAdapter mMianActivityAdapter;
    private List adapterList = new ArrayList();

    @Override
    protected Toolbar getToolbar() {
        return mToolbar;
    }
    
    @Override
    protected SwipeRefreshLayout getSwipeRefreshLayout() {
        return mSwipeRefreshLayout;
    }
    
    @Override
    protected int getLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initPresenter() {
        mPresenter = new MainPresenter(this, this);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initRecycleView();
        
    }

    /**
     * 初始化請(qǐng)求數(shù)據(jù)
     */
    @Override
    protected void intiData() {
        // 初始化數(shù)據(jù)
        mPresenter.initData();
        // 可刷新?tīng)顟B(tài)準(zhǔn)備好了
        mPrepareRefresh = true;
    }

    /**
     * 刷新請(qǐng)求數(shù)據(jù)
     */
    @Override
    protected void onRefreshStarted() {
        mPresenter.addMoreData();

    }

    @Override
    public void showEmptyView() {
        SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請(qǐng)求數(shù)據(jù)為空");
    }

    @Override
    public void showErrorView(Throwable throwable) {
        SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請(qǐng)求數(shù)據(jù)出錯(cuò)");
    }

    @Override
    public void hasNoMoreData() {
        SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"無(wú)更多數(shù)據(jù)");
    }

    /**
     * 初始化填充數(shù)據(jù)
     * @param mData
     */
    @Override
    public void fillData(List mData) {

        mMianActivityAdapter.insertedAllItem(mData);
    }

    /**
     * 加載更多數(shù)據(jù)
     * @param mData
     */
    @Override
    public void appendMoreDataToView(List mData) {
        mMianActivityAdapter.appendMoreItem(mData);
    }
    
    @Override
    protected int getMenuRes() {
        return R.menu.mian_menu;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.menu_1:
                SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"FragmentActivity");
                Intent intent = new Intent(MainActivity.this,FragmentActivity.class);
                startActivity(intent);
                break;

        }
        return super.onOptionsItemSelected(item);
    }

    private void initRecycleView() {
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        main_RecyclerView.setLayoutManager(layoutManager);
        mMianActivityAdapter = new DataAdapter(mContext,adapterList);
        main_RecyclerView.setAdapter(mMianActivityAdapter);
    }
}

代碼看的有點(diǎn)多,不過(guò)相對(duì)那種把什么功能都放在 activity 來(lái)講已經(jīng)很少了,而且看上面代碼結(jié)構(gòu)清晰,功能明確,職責(zé)分明,耦合度低,很適合擴(kuò)展。 ^-^ ///

其實(shí)上面的 activity 主要負(fù)責(zé)
(1) view 的 一些初始化,如:

@Bind(R.id.toolbar)
    protected Toolbar mToolbar;

    @Bind(R.id.swipe_refresh_layout)
    protected SwipeRefreshLayout mSwipeRefreshLayout;

    @Bind(R.id.main_RecyclerView)
    RecyclerView main_RecyclerView;
   private void initRecycleView() {
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        main_RecyclerView.setLayoutManager(layoutManager);
        mMianActivityAdapter = new DataAdapter(mContext,adapterList);
        main_RecyclerView.setAdapter(mMianActivityAdapter);
    }

(2)view 的一些更新,如:

 @Override
    public void showEmptyView() {
        SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請(qǐng)求數(shù)據(jù)為空");
    }
 /**
     * 初始化填充數(shù)據(jù)
     * @param mData
     */
    @Override
    public void fillData(List mData) {

        mMianActivityAdapter.insertedAllItem(mData);
    }

而數(shù)據(jù)的請(qǐng)求部分只有單單兩句:

 mPresenter.initData();
 mPresenter.addMoreData();

那么再來(lái)看一眼 什么是 MVP 設(shè)計(jì)模式:

M就是Model ,這里主要負(fù)責(zé)的就是業(yè)務(wù)處理,數(shù)據(jù)的獲取,例如數(shù)據(jù)庫(kù)的讀寫(xiě),http的網(wǎng)絡(luò)數(shù)據(jù)的處理。
V就是View ,顧名思義視圖的意思,這里主要的任務(wù)就是處理各個(gè)界面ui控件的處理。
P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。

咱們的 activity 就是 mvp 中的 v 層 ,而且職責(zé)明確,只負(fù)責(zé) ui 處理的 部分。

其他都交給了 Presenter 去做, 那咱們接下來(lái)再來(lái)分析分析 Presenter 是怎么做到 操作
model 和 view 之間的聯(lián)系的。

分析 MVP 中 P 層的實(shí)現(xiàn) 及 MainPresenter:

先看 activity 有繼承 IRefreshView 這個(gè)接口

public class MainActivity extends BaseSwipeRefreshActivity implements IRefreshView {
}

那么咱們?cè)?Presenter 取得數(shù)據(jù) 并調(diào)用 IRefreshView 接口,并在 MainActivity 實(shí)現(xiàn) 該接口的方法,這不就是:

P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。

具體看一下 MainPresenter 類(lèi):

public class MainPresenter extends BasePresenter{

    public MainPresenter(Activity context, IRefreshView view) {
        super(context, view);
    }

    public void initData(){

        mView.showRefresh();

        List strList = new ArrayList();
        for (int i=0;i<10;i++){
            strList.add(""+i);
        }

        mView.getDataFinish();
        mView.fillData(strList);

    }

    public void addMoreData(){

        mView.showRefresh();

        List strList = new ArrayList();
        for (int i=0;i<10;i++){
            strList.add("more_"+i);
        }

        mView.getDataFinish();
        mView.appendMoreDataToView(strList);

    }

}

 mPresenter.initData();
 mPresenter.addMoreData();

就是 MainPresenter 類(lèi) 里面的 方法 ,及Presenter 層,其實(shí)請(qǐng)求數(shù)據(jù)應(yīng)該是 Model 層的,但咱們的示例代碼請(qǐng)求模擬數(shù)據(jù)太簡(jiǎn)單的,就沒(méi)有再弄個(gè) 類(lèi)(及Model 層)來(lái)封裝。
數(shù)據(jù)請(qǐng)求前有個(gè):

mView.showRefresh();

數(shù)據(jù)請(qǐng)求后有個(gè):

 mView.getDataFinish();

這就是 persenter 層控制 model 層和 view 層的 作用了。

接下來(lái)看一下 抽象 view :

public interface IRefreshView extends ISwipeRefreshView {

    void fillData(List mData);

    void appendMoreDataToView(List mData);

    void hasNoMoreData();
 
}
public interface ISwipeRefreshView extends IBaseView {


    void getDataFinish();

    void showEmptyView();

    void showErrorView(Throwable throwable);

    void showRefresh();

    void hideRefresh();
}

好了,看到這里不知道明白了 MVP 設(shè)計(jì)模式的原理和好處了沒(méi)。大概終結(jié)一下:
activity 或 fragment 或是 視圖層要做的一些數(shù)據(jù)請(qǐng)求從而跟新 視圖,可以將中間這些操作交給 persenter 去做,視圖只負(fù)責(zé) ui 的處理,而 persenter 需要 去操作 modle 得到數(shù)據(jù)后通知跟新視圖,怎么通知呢,就是 利用 接口回調(diào) 的形式 更新視圖。也就是這開(kāi)頭講的這么一句話:

將View層抽象成view接口,將業(yè)務(wù)邏輯統(tǒng)統(tǒng)交給 Presenter 層去做。

建議可以下載源碼結(jié)合本片介紹,會(huì)有助于理解,本片博只是簡(jiǎn)單介紹一下流程,源碼做了一點(diǎn)封裝,可以到我的github clone ,歡迎stars ,此項(xiàng)目會(huì)繼續(xù)更新維護(hù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66210.html

相關(guān)文章

  • Android架構(gòu)

    摘要:目前它還未正式發(fā)布。理解系列一是谷歌在發(fā)布一套幫助開(kāi)發(fā)者解決架構(gòu)設(shè)計(jì)的方案。但最近還是推出了一份關(guān)于應(yīng)用架構(gòu)的實(shí)踐指南,并給出了相當(dāng)詳盡的步驟和一些指導(dǎo)建議。 MVP+Retrofit+Rxjava在項(xiàng)目中實(shí)戰(zhàn)解析 文章目標(biāo) MVP在android中的原理解析 MVP+Retrofit+Rxjava在項(xiàng)目中實(shí)戰(zhàn)解析 架構(gòu)經(jīng)驗(yàn)分享 MVP簡(jiǎn)單介紹 先說(shuō)說(shuō)MVC分層: View:對(duì)應(yīng)于布局...

    bergwhite 評(píng)論0 收藏0
  • Android開(kāi)源架構(gòu)

    摘要:音樂(lè)團(tuán)隊(duì)分享數(shù)據(jù)綁定運(yùn)行機(jī)制分析一個(gè)項(xiàng)目搞定所有主流架構(gòu)單元測(cè)試一個(gè)項(xiàng)目搞定所有主流架構(gòu)系列的第二個(gè)項(xiàng)目。代碼開(kāi)源,展示了的用法,以及如何使用進(jìn)行測(cè)試,還有用框架對(duì)的進(jìn)行單元測(cè)試。 Android 常用三方框架的學(xué)習(xí) Android 常用三方框架的學(xué)習(xí) likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,歡迎品嘗 簡(jiǎn)單的 MVP 模...

    sutaking 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<