Androidの開発:MVI、なぜ単により複雑になることができますか?

詳細

最近ではナゲッツMVIを圧倒、しかし読みはモスビーによって書かれ、私はそれモスビー開始料金を感じましたか?PublishSubjectの簡単な不快ハをスプレーしないで、この記事の例では、追加のスプレーを歓迎し、私を許してJAVA使用して、前のコードに変更され、達成することができ...

MVIコンセプト

MVIがコンセプトで、MVVMが一緒に表示され、アイデアが由来Rxjava応答アイデアに従うことです

MVVM私たちはすべて理解していると思い、データ層転写Livedata - > persenter - >リスナーを登録し、その後UI層と、これは一方向のプロセスであり、データから - > UIプロセス:

一般的なMVVMは、我々はすべてのように書かれているが、より徹底した書き込みを何人かの人々は、アプリの相互作用がUIで始まる、双方向のプロセスである - >データは、データは - > UIは、単に一般的な方法の上に私たちは片側を達成、より徹底応答変換にもイベントが応答する]をクリックし、データ層のボタンクリックイベントリスナーは、上水パイプラインを経由してリモートデータリターンをデータを受信して​​、下水管を介してデータを返すために登録しました:

一般的には、たくさんの悩みを書いていません -

MVIと双方向MVVM同じ考えが、違いは、MVIあるMVIさらにアクションUIの抽象化、Iである - テント、MVIイベントは応答データソースとして見られているUIのいずれかにで、タスクがバインド層PにありますVとMの関係登録層は、ちょうどヒーターは、水パイプを断って:

このインテントでMVIが自分の考えを持って、インテントUIページの変更は、例えば、ViewStateが内部負荷は、netErrorは、成功ページの各種フラグの状態を表すオブジェクトがある表現するデータ型で、全体の通りであります、パイルP層はViewStateの、真にMVPの状態に応じてUIの表示状態のない書き込み制御方法を行うように、異なるパターンを表示するためのデータ、UI UI層の直接ViewStateのではなく、データ層を返します物事は、当然のことながら、MVVM、MVVMを行うが、一般的に、直接のリターンデータが存在することができます気に階層的な思考は、本当にまた、データ・ページのステータス多くない人にパッケージを置きます

class NetViewState(
        var loading: Boolean = false,
        var success: Boolean = false,
        var netError: Boolean = false,
        var dataError: Boolean = false,
        var dataNo: Boolean = false,
        var message: String = "",
        var data: BookResponse = BookResponse()) {

    companion object Help {

        @JvmStatic
        fun loading(): NetViewState {
            return NetViewState(loading = true)
        }

        @JvmStatic
        fun success(data: BookResponse): NetViewState {
            return NetViewState(success = true, data = data)
        }

        @JvmStatic
        fun netError(message: String): NetViewState {
            return NetViewState(netError = true, message = message)
        }

        @JvmStatic
        fun dataError(message: String): NetViewState {
            return NetViewState(dataError = true, message = message)
        }

        @JvmStatic
        fun dataNo(message: String): NetViewState {
            return NetViewState(dataNo = true,message = message)
        }
    }
}

から行くためのコード

MVI私は多くの記事を読んで、派生タイプの多くをもたらしたモスビー、モスビーこのライブラリによって達成され、各文字は、その基本クラスを持っている事実上大幅にコストを学んで増加し、MVIは、この考え方をさらにMVVMでありますそれは簡単に読み取るには、誰もが行うことを期待していないのではなく、より複雑な、全体の、シンプルな良いを完了する必要はなく、簡単に理解していませんでした

使用して、熱放射をrxjavaまたはLivedataは単にMVIを達成することができ、私はMVIを達成するために、独自の外に、モスビーを使用しない、デモを次のようにのみ、より内省してくださいパッケージ、最適化を実証します

宇井層は意図外部イベントを提供します

protected void onCreate(Bundle savedInstanceState) {
        btn_book.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bookIntent.onNext(new BookRequest("人生", "", "0", "10"));
            }
        });

        persenter.netActivity = this;
        persenter.bingIntent(bookIntent);
    }

    void updata(NetViewState netViewState) {

        if (netViewState.getLoading()) {
            Log.d("AA", "loading ...");
            return;
        }

        if (netViewState.getNetError()) {
            Log.d("AA", " netError:" + netViewState.getMessage());
        }

        if (netViewState.getDataError()) {
            Log.d("AA", " dataError:" + netViewState.getMessage());
        }

        if (netViewState.getSuccess()) {
            List<BookResponse.Book> books = netViewState.getData().getBooks();
            if (books != null && books.size() == 0) {
                ToastComponent.Companion.getInstance().show("没有数据", Toast.LENGTH_SHORT);
            }
            adapter.refreshData(books);
        }
    }

UI層のMレベルアテンション・イベント・アップストリームは、データ層は、視聴者の下流側に設けられています。

public class BookRepositroy {

    public static final String URL_BOOK_LIST = "book/search";
    public PublishSubject<NetViewState> bookData = PublishSubject.create();

    public void bingIntent(Observable<BookRequest> bookIntent) {
        bookIntent.subscribe(new Consumer<BookRequest>() {
            @Override
            public void accept(BookRequest bookRequest) throws Exception {
                getBookData(bookRequest);
            }
        });
    }

    private void getBookData(BookRequest bookRequest) {

        Map<String, String> map = new HashMap<>();
        map.put("q", bookRequest.getTitle());
        map.put("tag", bookRequest.getTag());
        map.put("start", bookRequest.getStartCount());
        map.put("count", bookRequest.getWantCount());

        HttpClient.Companion.getInstance().get(URL_BOOK_LIST, map)
                .map(new Function<ResponseBody, NetViewState>() {
                    @Override
                    public NetViewState apply(ResponseBody responseBody) throws Exception {
                        BookResponse bookResponse = null;
                        try {
                            bookResponse = new Gson().fromJson(responseBody.string(), BookResponse.class);
                        } catch (Exception e) {
                            Observable.error(e);
                        }
                        return NetViewState.success(bookResponse);
                    }
                })
                .onErrorReturn(new Function<Throwable, NetViewState>() {
                    @Override
                    public NetViewState apply(Throwable throwable) throws Exception {

                        if (throwable instanceof HttpException) {
                            // HTTP错误
                            return NetViewState.netError("网络错误");
                        } else if (throwable instanceof ConnectException
                                || throwable instanceof UnknownHostException) {
                            // 连接错误
                            return NetViewState.netError("连接错误");
                        } else if (throwable instanceof InterruptedIOException) {
                            // 连接超时
                            return NetViewState.netError("连接超时");
                        } else if (throwable instanceof JsonParseException
                                || throwable instanceof JSONException
                                || throwable instanceof ParseException) {
                            return NetViewState.dataError("解析错误");
                        } else if (throwable instanceof ApiException) {
                            return NetViewState.netError(throwable.getMessage());
                        } else if (throwable instanceof IOException) {
                            return NetViewState.netError("网络错误");
                        }
                        return NetViewState.netError("位置错误");
                    }
                })
                .startWith(NetViewState.loading())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Consumer<NetViewState>() {
                    @Override
                    public void accept(final NetViewState netViewState) throws Exception {
                        bookData.onNext(netViewState);
                    }
                });
    }
}

結合p層下流(VとP)の関係

public class NetPersenter {

    public NetActivity netActivity;
    BookRepositroy repositroy = new BookRepositroy();

    public void bindBook(PublishSubject<BookRequest> bookIntent) {

        repositroy.bingIntent(bookIntent);
        repositroy.bookData.subscribe(new Consumer<NetViewState>() {
            @Override
            public void accept(NetViewState netViewState) throws Exception {
                netActivity.updata(netViewState);
            }
        });
    }
}

思考:

  • V層、内側にP層への登録下流データなしP層、我々は最初に対処するためにビジネスロジックを持っている可能性があるため、直接ではなくU層へ
  • ロードイベントを送信するためにstartWithの優先順位を使用してM層
  • さらに状態のほとんどが同じページあり、最適化することができ、ViewStateが、ここで、アウト抽象基底クラスへの必要性がある、とkoltinシールクラス(密封された)の使用は、より良い行うことができ、今で言うことはkotlinの時代で、純粋なJava私は、ページが上記の変更の前に書かれていたので、これは、コードはすべきではない投稿、または私はkotlinます

遂に

コードのない数行が、それはモスビーMVI書かれて使用されている記事が出てきた書き込みをするつもりが、その後オンラインライブラリについて考えていただろう、私は単純に、なぜそれがより複雑になることができ、あなたにそれを別のアイデアを提供するために書きます


これで私はまた、自身が仕上げ含ま兄共有するAndroidのアーキテクチャの研究PDF +動画+インタビュー+ドキュメント・ソース・ノートだけでなく、高度な技術アーキテクチャ高度な脳マッピング、テーマの開発、シニア高度情報アーキテクチャとAndroidのインタビューこれらは私のレジャーブティックは、読み出しデータを繰り返すことになります。マインドマップでは、各ポイントは、実際のプロジェクトに対応するトピックの知識が装備され、効果的にあなたが知識ポイントを把握するのに役立つことができます。

要するに、私たちは、高度な学習強化ここで助けにもありますが、またあなたは、オンライン検索データを学習する時間を節約するにも一緒に勉強親しい友人と共有することができます

あなたが必要としている場合は、次のことができます+コメントのように指して懸念私プラスVxを:15388039515(注CSDN、必要性より高度なデータ)

公開された200元の記事 ウォン称賛83 ビュー70000 +

おすすめ

転載: blog.csdn.net/weixin_45258969/article/details/104419790