Android MVP限界パッケージ(一)


MVPアーキテクチャはAndroidというブロックですでに盛んに行われていますが、一部の学習能力の強い人にとって、すでに自由に運用することができて、甚だしきに至っては改造して最適化することができます.
MVPアーキテクチャは何なのかはあまり言わないが、ブロガーは主にMVPアーキテクチャをどのように設計するかを共有している.
まずMVPがどのように使われているかを分析する.M-V-Pの3層の間で、Pは中間層として、M,V間のデータ相互作用の仲介を担当し、データをM層から取得し、処理した後にV層に提出する.言い換えれば、VはPのインスタンスを持つ必要があり、P層はVのインスタンスを持つ必要がある.原理はとても簡単で、汎用型を使ってデータに対してカプセル化処理を行います:1.Vレイヤの空のインタフェースを定義します.主にパッケージングが便利です.
/**
 * V   
 */
public interface IView {
}

2.P層のインタフェースを定義する:
/**
 *      
 * 
 */
public interface IPresenterextends IView> {

    /**
     *     
     * 
     * @param view
     */
    void attachView(V view);

    /**
     *     (  V         ,             )
     */
    void dettachView();

}

3.パッケージPベースクラス:バインド解除Vインスタンス
/**
 *         View        
 *
 * @param 
 */
public class BasePresenter<V extends IView> implements IPresenter<V> {

    private WeakReference weakView;
    protected M model;

    public V getView() {
        return proxyView;
    }

    /**
     *     View      
     *
     * @return
     */
    public boolean isAttachView() {
        return this.weakView != null && this.weakView.get() != null;
    }

    @Override
    public void attachView(V view) {
        this.weakView = new WeakReference(view);
    }

    @Override
    public void dettachView() {
        if (this.weakView != null) {
            this.weakView.clear();
            this.weakView = null;
        }
    }
}

4.M層パッケージ:
/**
 * M 
 */
public interface IModel {

}

/**
 *   model
 * Created by admin on 2018/2/5.
 */
public interface ILoginModel extends IModel {
    void login(LoginCallback callback);//callback       
}

/**
 *   
 * Created by admin on 2018/2/5.
 */
public class LoginModel implements ILoginModel {
    @Override
    public void login(LoginCallback callback) {
        // TODO: 2018/2/5        
    }
}

その後、activityまたはfragmentにデータをコミットすればよい.最も基本的なマットはすでにできています.次はViewをパッケージします.
/**
 * Created by admin on 2018/2/5.
 */

public abstract class MvpActivity<V extends IView, P extends BasePresenter<V>> extends AppCompatActivity implements IView {

    private P presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        presenter=getPresenter();
        presenter.attachView((V)this);
    }

    protected P getPresenter() {
        return presenter;
    }

    protected void setPresenter(P presenter) {
        this.presenter = presenter;
    }

    protected V getView() {
        return (V) this;
    }
    ...
    @Override
    protected void onDestroy() {
        presenter.dettachView();
        ...
        super.onDestroy();
    }
}

工事が終わり、MVPの基礎フレームワークが完成した.そうですね.基礎フレームワークですが、使えるかどうか、楽しみにしていましょう.まずViewを書きます.
public interface ILoginView extends IView {

    void onLoginSuccess();
    void onFailed();

}

そしてPresneter:
/**
 * Created by admin on 2018/2/5.
 */
public class LoginPresenter extends BasePresenter<ILoginView, LoginModel> {

    public LoginPresenter() {
        model = new LoginModel();
    }

    public void login(){
        ((LoginModel)model).login(new LoginCallBack() {
            @Override
            public void onSuccess() {
                if(null!=getView()){
                    getView().onLoginSuccess();
                }
            }

            @Override
            public void onFailure() {
                if(null!=getView()){
                    getView().onFailed();
                }
            }
        });
    }

}

最後にActivityのロジックを完了します.
public class LoginActivity extends MvpActivity<ILoginView, LoginPresenter> implements ILoginView {
    ...
    @Override
    public LoginPresenter getPresenter() {
        return new LoginPresenter();
    }

    public void login(View view) {
        String name = etUserName.getText().toString();
        String pwd = etUserPwd.getText().toString();
        getPresenter().login(name, pwd);
    }

    @Override
    public void onLoginSuccess() {

    }

    @Override
    public void onFailed(){

    ...
}

ブログではMVPアーキテクチャをカプセル化する方法だけを簡単に紹介していますが、完璧ではありません.MVPアーキテクチャの最適化は現在問題を発見しています.もし皆さんが何か発見があれば、私に連絡してください.一緒に努力して改善してください.