Android MVP限界パッケージ(一)
MVPアーキテクチャはAndroidというブロックですでに盛んに行われていますが、一部の学習能力の強い人にとって、すでに自由に運用することができて、甚だしきに至っては改造して最適化することができます.
MVPアーキテクチャは何なのかはあまり言わないが、ブロガーは主にMVPアーキテクチャをどのように設計するかを共有している.
まずMVPがどのように使われているかを分析する.M-V-Pの3層の間で、Pは中間層として、M,V間のデータ相互作用の仲介を担当し、データをM層から取得し、処理した後にV層に提出する.言い換えれば、VはPのインスタンスを持つ必要があり、P層はVのインスタンスを持つ必要がある.原理はとても簡単で、汎用型を使ってデータに対してカプセル化処理を行います:1.Vレイヤの空のインタフェースを定義します.主にパッケージングが便利です.
2.P層のインタフェースを定義する:
3.パッケージPベースクラス:バインド解除Vインスタンス
4.M層パッケージ:
その後、activityまたはfragmentにデータをコミットすればよい.最も基本的なマットはすでにできています.次はViewをパッケージします.
工事が終わり、MVPの基礎フレームワークが完成した.そうですね.基礎フレームワークですが、使えるかどうか、楽しみにしていましょう.まずViewを書きます.
そしてPresneter:
最後にActivityのロジックを完了します.
ブログではMVPアーキテクチャをカプセル化する方法だけを簡単に紹介していますが、完璧ではありません.MVPアーキテクチャの最適化は現在問題を発見しています.もし皆さんが何か発見があれば、私に連絡してください.一緒に努力して改善してください.
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アーキテクチャの最適化は現在問題を発見しています.もし皆さんが何か発見があれば、私に連絡してください.一緒に努力して改善してください.