Androidの高度なMVPアーキテクチャ

前に書く

友達、あなたがいなくて2日が経ちました!最近AndroidのMVPアーキテクチャを勉強しているので、この2日間は更新する時間がありませんでした。これは、Androidの高度なテクノロジーの重要なポイントでもあると思います。

昨日、周りの友達にも聞いてみたら、「Androidについてどんなアーキテクチャを学んでいるのか知ってる?」と呆然と言った。「言わないで、Androidのアーキテクチャは本当にわからない」と。は初心者ではありません。彼は1年間Androidを学びました。彼は、当時私と一緒にAndroidの基本から学んだ小さなパートナーです。それから私はここ数日の建築を通して彼に簡単に話しました、そして彼はその時に突然気づきました。

これは状況を示しています。これらのAndroid関連の技術的なポイントを積極的に学習して理解しないと、常にゆっくりと排除されてしまいます。私のこの小さな友達はおそらく排除されていません、ハハ、私は彼を指すためにここにいます!

この2日間の空き時間を最大限に活用し、ドキュメントやブログを調べて、MVPアーキテクチャの構造を完全に理解しました。次に、手元にあるプロジェクトのMVPアーキテクチャを使用して再度実行しましたが、これは落とし穴と考えられています。

公式アカウントの最初からフォローしてくれた読者は、記事を投稿するために記事を書くことはないことを知っています。共有する価値のある技術記事が本当にない場合は、過去に対処するために記事を書くだけではありません。私の個人的な執筆経験から、真に価値があり、他の人が真に栄養価の高い技術を学ぶことができる記事は、少なくともドラフトから構想、要約と仕上げ、そして最終的に公式で共有されるまで植字する必要があると結論付けることができますアカウント。2時間以上では十分ではありません。私はかつて実験を行い、1時間で技術記事をすばやく完成させました。読者はしばしば結果を得ることができず、読書量は暗かったです。読者の心はこの技術的ポイントの一般的な枠組みにすぎませんでした。読者が本当に記事の肩を使って登りたいのであれば、これはまだ記事の著者に非常に厳しい要件があります。Zhang Geが言ったように、公式アカウントを作成する人は増えていますが、高品質の記事はまだ少ないです。盲目的に毎日投稿することを主張します、あなたは記事の質を考慮しましたか?あまりナンセンスではありません。MVPアーキテクチャに直接アクセスして、今日の発言を理解してください。

Androidの高度なMVPアーキテクチャ
テキスト

MVPアーキテクチャを紹介する前に、MVCアーキテクチャについて簡単に説明します。M「モデルレイヤー」V「ビューレイヤー」C「コントロールレイヤー」。MVCアーキテクチャは、初心者が始めるのに非常に適したアーキテクチャであり、サーブレットのバックグラウンドサービスに使用されます。現在、同社は基本的にssmフレームワークを開発に使用しています。ここではMVCの詳細な紹介はあまりありません。知りたい場合は、インターネット上に参照および学習用のドキュメントが多数あります。Androidでは、MVCアーキテクチャは一般的に使用されておらず、使用にも適していません。ビュービューレイヤーとコントロールコントロールレイヤーのコードはアクティビティ全体に実装されているため、ビューレイヤーとコントロールコントロールレイヤーの間で処理される関数の分離を明確に示すことはできません。そのため、AndroidはMVCをさらに改良し、一般的に使用されているMVPアーキテクチャに進化しました。M「モデルモデルレイヤー」V「ビュービューレイヤー」P「プレゼンターレイヤー」英語に翻訳されたプレゼンターが代表の意味です。彼はMVPアーキテクチャでどのような役割を果たしていますか?その役割は、ビューレイヤーとモデルレイヤーを接続することです。率直に言って、彼は両端で通信を維持する電話回線です。MVPとMVCのもう1つの違いは、モデルレイヤーとビューレイヤーは直接通信できず、このプレゼンター回線の接続を介してのみ通信できることです。以前のMVCはどうですか?制御層を電話回線と考えることはできませんが、処理ロジックのクラスと考えることができます。ビュー層、制御層、およびモデル層は相互に通信できます。3つの間のデータ転送は非常にランダムです。 。制限。MVPアーキテクチャを振り返ると、ModelレイヤーとViewレイヤーからのデータは、両方の処理のためにPresenterレイヤーに渡されます。これまで理解していなくても構いませんが、以下で詳しく説明します。

一連の図を見てみましょう。

MVC構造図:

Androidの高度なMVPアーキテクチャ

MVP構造図

Androidの高度なMVPアーキテクチャ

2つのアーキテクチャの違いは一歩明確ですか?

何人かの友人は急いでいます、兄弟、ナンセンスな話をやめ、ただコードに行き、これらの概念について話さないでください。上記の概念は、頭の中で一般的なフレームワークを形成するためのものです。MVP構造の基本を理解している場合にのみ、以下に示す例を明確に理解できます。

MVPフレームワークを使用して、ユーザーログインの例を記述してください。

ステップ1:パッケージのディレクトリ配布

リスト:

Androidの高度なMVPアーキテクチャ
サブカテゴリ:

Androidの高度なMVPアーキテクチャ

ステップ2:モデルレイヤー

Userクラスは、データクラスであるBeanです。


 1public class User {
 2    private String username ;
 3    private String password ;
 4    public String getUsername() {
 5        return username;
 6    }
 7    public void setUsername(String username) {
 8        this.username = username;
 9    }
10    public String getPassword() {
11        return password;
12    }
13    public void setPassword(String password) {
14        this.password = password;
15    }
16}

IOnLoginListenerは、「ログインが成功したかどうかを判断する」ためのインターフェースです。

1public interface IOnLoginListener {
2    //登录成功
3    void loginSuccess(User user);
4    //登录失败
5    void loginFailed();
6}

IUserImpは、ログイン機能のインターフェイスです。


1public interface IUserImp {
2    //登录
3    public void login(String username, String password, IOnLoginListener loginListener);
4}

UserImpは、IUserImpインターフェイスの実装クラスです。


 1public class UserImp implements IUserImp {
 2    @Override
 3    public void login(final String username, final String password, final IOnLoginListener loginListener) {
 4        //模拟子线程耗时操作
 5        new Thread() {
 6            @Override
 7            public void run() {
 8                try {
 9                    Thread.sleep(2000);
10                } catch (InterruptedException e) {
11                    e.printStackTrace();
12                }
13                //模拟登录成功
14                if ("zhy".equals(username) && "123".equals(password)) {
15                    User user = new User();
16                    user.setUsername(username);
17                    user.setPassword(password);
18                    loginListener.loginSuccess(user);
19                } else {
20                    loginListener.loginFailed();
21                }
22            }
23        }.start();
24    }
25}

ステップ3:ビューレイヤーを表示する

ビューのIUserLoginViewは、UIとの相互作用を実現するメソッドインターフェイスです。


 1public interface IUserLoginView {
 2    //View获取用户名和密码
 3    String getUserName();
 4    String getPassword();
 5    //清除用户名和密码
 6    void clearUserName();
 7    void clearPassword();
 8    //耗时提示ProgressBar
 9    void showLoading();
10    void hideLoading();
11    //提醒 登录成功失败
12    void toMainActivity(User user);
13    void showFailedError();
14}

ステップ4:プレゼンターレイヤー

ビューレイヤーとモデルレイヤーを接続するためのPersenterクラスの役割:


 1public class UserLoginPresenter {
 2    private IUserImp userBiz;
 3    private IUserLoginView userLoginView;
 4    private Handler mHandler = new Handler();
 5    public UserLoginPresenter(IUserLoginView userLoginView) {
 6        this.userLoginView = userLoginView;
 7        this.userBiz = new UserImp();
 8    }
 9    public void login() {
10        userLoginView.showLoading();
11        userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(), new IOnLoginListener() {
12            @Override
13            public void loginSuccess(final User user) {
14                //需要在UI线程执行
15                mHandler.post(new Runnable() {
16                    @Override
17                    public void run() {
18                        userLoginView.toMainActivity(user);
19                        userLoginView.hideLoading();
20                    }
21                });
22            }
23            @Override
24            public void loginFailed() {
25                //需要在UI线程执行
26                mHandler.post(new Runnable() {
27                    @Override
28                    public void run() {
29                        userLoginView.showFailedError();
30                        userLoginView.hideLoading();
31                    }
32                });
33            }
34        });
35    }
36    public void clear() {
37        userLoginView.clearUserName();
38        userLoginView.clearPassword();
39    }
40}

ステップ5:ログイン機能を実装するためのLoginActivity


 1public class UserLoginActivity extends Activity implements IUserLoginView{
 2    private EditText mEtUsername,mEtPassword;
 3    private Button mBtnClear,mBtnLogin;
 4    private ProgressBar mPbLoading;
 5    private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
 6    @Override
 7    protected void onCreate(@Nullable Bundle savedInstanceState) {
 8        super.onCreate(savedInstanceState);
 9        setContentView(R.layout.activity_main);
10        initViews();
11    }
12    private void initViews()
13    {
14        mEtUsername = (EditText) findViewById(R.id.id_et_username);
15        mEtPassword = (EditText) findViewById(R.id.id_et_password);
16        mBtnClear = (Button) findViewById(R.id.id_btn_clear);
17        mBtnLogin = (Button) findViewById(R.id.id_btn_login);
18        mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading);
19        //登录
20        mBtnLogin.setOnClickListener(new View.OnClickListener() {
21            @Override
22            public void onClick(View v) {
23                mUserLoginPresenter.login();
24            }
25        });
26        //取消登录
27        mBtnClear.setOnClickListener(new View.OnClickListener() {
28            @Override
29            public void onClick(View v) {
30                mUserLoginPresenter.clear();
31            }
32        });
33    }
34    @Override
35    public String getUserName() {
36        return mEtUsername.getText().toString();
37    }
38    @Override
39    public String getPassword() {
40        return mEtPassword.getText().toString();
41    }
42    @Override
43    public void clearUserName() {
44        mEtUsername.setText("");
45    }
46    @Override
47    public void clearPassword() {
48        mEtPassword.setText("");
49    }
50    @Override
51    public void showLoading() {
52        mPbLoading.setVisibility(View.GONE);
53    }
54    @Override
55    public void hideLoading() {
56        mPbLoading.setVisibility(View.VISIBLE);
57    }
58    @Override
59    public void toMainActivity(User user) {
60        Toast.makeText(this, user.getUsername() +
61                " login success , to MainActivity", Toast.LENGTH_SHORT).show();
62    }
63    @Override
64    public void showFailedError() {
65        Toast.makeText(this,
66                "login failed", Toast.LENGTH_SHORT).show();
67    }
68}

このアーキテクチャを学んでいたとき、少し混乱しました。インターフェイスのさまざまな実装により、めまいがしました。じっくりと考えていたのですが、最終的にはそうなると思います。これらの努力と献身により、MVPと呼ばれる構造をようやく完全に理解することができました。アーキテクチャ全体のロジックとフローを簡単に理解できるように、ブレークポイントを介してデバッグし、プログラムを段階的に実行するための優れた方法を提供します。

上記の一連の調査を通じて、一部の友人は、単純なログインシステムでコードの量をどのように増やすのかと尋ねます。そうです、コードの量が増えました。プロジェクトの論理構造がはるかに明確になったと思いますか?さらに、各アーキテクチャレイヤーの各クラスは、所定のタスクを実行する必要があります。「ビュービューレイヤーは、主にUIインターフェイスとの対話を担当します(ユーザーボタンイベントのリッスンなど)。モデルモデルレイヤーは、主にデータオブジェクトの管理を担当します。プレゼンターレイヤーは主にモデルとビュー間のデータ通信を管理し、論理操作を処理します。この種のアーキテクチャは、小規模なプロジェクトにはメリットがありません。将来、大規模なプロジェクトを開発する場合、コードの量は数万に上り、MVPアーキテクチャのメリットが明確に示され、後のプロジェクト。利点は、コードをアクティビティに書き込むよりもはるかに優れています。たとえば、会社のプロジェクトでは機能を追加する必要があります。通常の慣例では、最初にアクティビティ全体のロジックを明確にします。ロジックを明確にすると、会社のカンゾウは寒いと推定されます。ただし、MVPアーキテクチャを使用すると、関数を実装するインターフェイスを正確に見つけ、メソッドを自由に追加し、メソッドを実装する実装クラスを見つけてから、関数を実装できます。実際にそれを実行した場合にのみ、このアーキテクチャの利点を実感できます。bbにはソフトな用途はないと言っているのを聞いてください。

さて、この2日間で主にMVPアーキテクチャについて学びました。欠点がある場合は、バックグラウンドでメッセージを残し、後で追加します。

追記

今日のみんなの乾物を更新するために、これらのほとんどは朝のクラスにまとめられています。乾いた記事を作るのは本当に簡単ではありません。この記事の冒頭から公式アカウントの公開まで、あなたはまだ信じられていませんでした。この記事を更新するのに3時間半かかると計算しました。また、公式アカウントには高品質の記事がますます少なくなっています。これらはすべて、低品質の記事をためらうことなく更新できるようにするためです。相互利益の促進とブラインドフォワーディングはほぼ正常な状態になりました。私の公式アカウントが常にこのような高品質の乾物を出力できることを願っています。私自身の理解、要約、分析、考察、考察を通じて、私は創造に努めています。ユニークで純粋な公式アカウント。

おすすめ

転載: blog.51cto.com/15064450/2602798