定義MVP框架

結構如下圖所示

Model層回調接口如下 

Presenter層調用model層的方法請求數據,如果是異步則通過該回調將數據返回到P層

public interface BaseCallInterface<T> {

    /**
     * 回調數據
     * @param t
     */
    void callBackData(T t);

}

Model文件如下   

Model層獲取數據的方法

public interface Model {

    void setCallBack(BaseCallInterface callBack);
}

View文件

連接Activity和Presenter的接口

public interface View {
    /**
     * 基礎的返回,可以刪除,只是抽取共性
     * @param info
     */
    void showMessage(String info);
}

presenter文件

P層,連接V層和Model層, V層調用P層的方法-->>然後P層通過執行Model層的方法,Model層在執行完方法後執行接口方法,
由於P層實現了Model層的回調,然後通過P層執行V層的方法完成M和V層之間的數據傳遞
public interface Presenter<M extends Model, V extends View> {
    /**
     * 註冊Model層
     *
     * @param model
     */
    void registerModel(M model);

    /**
     * 註冊View層
     *
     * @param view
     */
    void registerView(V view);

    /**
     * 獲取View
     *
     * @return
     */
    V getView();

    /**
     * 銷燬動作(如Activity、Fragment的卸載)
     */
    void destroy();
}

BaseMvp文件

抽取Activity和Fragment的初始化方法以及創建MVP的方法

public interface BaseMvp<M extends Model, V extends View, P extends BasePresenter> {

    M createModel();

    V createView();

    P createPresenter();

    ViewGroup getViewGroupRoot();

    int getContentViewId();

    void initSubView(android.view.View view);

    void initData();

}

BasePresenter文件

實現Presenter接口的抽象類

public abstract class BasePresenter<M extends Model, V extends View> implements Presenter<M, V> {
    /**
     * 使用弱引用來防止內存泄漏
     */
    private WeakReference<V> wrf;
    protected M model;

    protected boolean isViewAttrs(){
        if (wrf!=null){
            return true;
        }else {
            return false;
        }
    }

    @Override
    public void registerModel(M model) {
        this.model = model;
    }

    @Override
    public void registerView(V view) {
        wrf = new WeakReference<V>(view);
    }

    @Override
    public V getView() {
        return wrf == null ? null : wrf.get();
    }

    /**
     * 在Activity或Fragment卸載時調用View結束的方法
     */
    @Override
    public void destroy() {
        if (wrf != null) {
            wrf.clear();
            wrf = null;
        }
        onViewDestroy();
    }

    protected abstract void onViewDestroy();
}

BaseMvpActivity文件如下

public abstract class BaseMvpActivity<M extends Model, V extends View, P extends BasePresenter> extends AppCompatActivity implements BaseMvp<M, V, P> {
    protected P presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        android.view.View containerView = getLayoutInflater().inflate(getContentViewId(),
                getViewGroupRoot());
        setContentView(containerView);
        //創建Presenter
        presenter = createPresenter();
        if (presenter != null) {
            //將Model層註冊到Presenter中
            presenter.registerModel(createModel());
            //將View層註冊到Presenter中
            presenter.registerView(createView());
        }
        initSubView(containerView);
        initData();
    }

    @Override
    public abstract int getContentViewId();

    @Override
    public ViewGroup getViewGroupRoot() {
        return null;
    }
    @Override
    public void initSubView(android.view.View view) {
    }

    @Override
    public void initData() {
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter != null) {
            //Activity銷燬時的調用,讓具體實現BasePresenter中onViewDestroy()方法做出決定
            presenter.destroy();
        }
    }
}

BaseMvpFragment如下

public abstract class BaseMvpFragment<M extends Model, V extends View, P extends BasePresenter> extends Fragment implements BaseMvp<M, V, P> {
    protected P presenter;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        presenter = createPresenter();
        if (presenter != null) {
            presenter.registerModel(createModel());
            presenter.registerView(createView());
        }
    }

    @Override
    public android.view.View onCreateView(LayoutInflater inflater, ViewGroup container,
                                          Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        android.view.View containerView = inflater.inflate(getContentViewId(), container,
                false);
        initSubView(containerView);
        initData();
        return containerView;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (presenter != null) {
            presenter.destroy();
        }
    }
}

以上就是base包中的全部文件

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章