序文
前の年の上昇MVVM
建築デザインパターン、フレームの最も代表的であるDataBinding
私は、この時間の短い期間があまりにも人気のデザインアーキテクチャではないかもしれないと思ったので、このアーキテクチャのデザインは非常に革新的ではあるが、まだ使用中、多くの痛みのポイントがあります。
最近、新しいプロジェクトを引き継いで使用されるMVVM
だけの努力の1つまたは2つの年を見つけるために、MVVM
たとえそうであっても、すぐに開発を、それはすでにAndroidの開発者のために必要なスキルの一つです。
テキスト
DataBinding
最初の段階では、私が最も厄介では、データ処理の問題でありました、多くの場合、データを表示するためには、私がしたいXML
に結合しN
、複数のフィールド、それはプロジェクトの平均を上回っている場合など、さらに多くの退屈な問題が、あります。
- あなたは、
XML
緊急の必要があるかもしれませんif
かswitch
、そのような判断を。 - 予期しないNULLポインタ
2018年には、Google
の打ち上げJetPack
図書館、ViewModel+LIveData
最終的にはMVVM
新たな高みにプッシュ。
ViewModelに
使用ViewMode
に頼るリットルの必要性lifecycle
ライブラリ:
implementation "android.arch.lifecycle:viewmodel:x.x.x"
implementation "android.arch.lifecycle:extensions:x.x.x"
ViewModel
創造主に2つの方法があります。
// 获取FragmentActivity共享的ViewModel
ViewModelProviders.of(FragmentActivity).get(ViewModel::class.java)
// 获取FragmentActivity共享的ViewModel
ViewModelProviders.of(Fragment).get(ViewModel::class.java)
ViewModel
共有範囲は主に二つある。一つはあるFragmentActivity
1がある、Fragment
あなたが自分のニーズに応じて範囲を共有することを選択することができます。必要に応じてApplication
レベルをViewModel
、現在サポートされていません、あなたがカスタマイズすることができますApplication
保持するためにViewModel
、またはシングルトンパターンを使用します。
ViewModelに問題
1、データ共有シナリオの拡張。
一般的なデータ共有でデータ転送、伝統的なアプローチが使用され、この方法は、次のような欠点があります。Activity
Fragment
setArguments(Bundle)
- これは、予測できないことができ
setArguments
意志Fragment
サイクルが異常の判断であることを、完了しました。 setArguments
場合、データの変更は、見ることができるActivity
直接設定Fragment
データは、高い結合します。- より多くのデータは、
Fragment
可読性や保守性に影響を与える多くの変数が存在します。
使用してViewModel
、より多くの恥ずかしい事態を避けるために、どのようなデータがあなたから必要とされているViewModel
に取ります:
- 新しい追加のデータ転送、変更することなくコード方式を、受信したデータを書き込みません。
Activity
setArguments
Fragment
- 関係なく、あなたは、一時的に未使用のコードを削除するかどうかの、データ転送を削減。
- データをフェッチする場合、あなたが判断を行うことができ、データの妥当性を注意してください。
また、カスタムはView
得ることができますViewModel
ので、いくつかの機能的結合は非常に強力なカスタムでView
容易に開発。しかし、そのノートコンテキストがあるタイプ(されません)、あなただけ使用することができるデータ共有のレベルを。View
context
Activity
Fragment
Activity
ビュー表示をデータバインディングの問題を解決するには2、。
ビューは、大量のデータが必要な場合は、XML
それはますます肥大化となり、緊急の必要性は、以下のようないくつかの単純な判断を、追加します:
Aが空である場合、Cが空である場合、Bは、最初のCに空である場合に表示されるBは、であり、...
が、DataBinding
三項演算子のサポートは判決であればニーズを満たすために、それは明らかであるXML
メンテナンスよりもロジックJava
またはKotlin
はるかに困難(無スペルエラー、など)。だから我々は非常にいくつかのコードを配置する必要がありXML
、隔離ViewModel
この役割のために非常に有資格。
改正前:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="A"
type="String" />
<variable
name="B"
type="String" />
<variable
name="C"
type="String" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="4"
android:ellipsize="middle"
android:text="A != null ? A : B != null ? B : C" />
...
</layout>
更新:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="ViewModel" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="4"
android:ellipsize="middle"
android:text="@{viewModel.getShowContent()}" />
...
</layout>
LiveData
ちょうど今、我々が議論してきたViewModel
使用方法の最善の方法を、しかしそこには、問題が解決されないされ、それがデータ更新の問題であり、この問題を解決するには、観察者モードにですが、観察者の登録和解タイに対処しなかった場合は、メモリを起こしやすいですオーバーフロー。LiveData
これは、この問題の完璧な解決策になることができます。
私たちは、追加する必要がLiveData
依存関係を:
implementation "androidx.lifecycle:lifecycle-livedata:2.1.0"
以下は簡単な例です:
// 名为openDrawer的Boolean类型的LiveData
public final MutableLiveData<Boolean> openDrawer = new MutableLiveData<>();
// 更新openDrawer
openDrawer.setValue(true)
// 观察openDrawer 的值的变化
openDrawer.observe(this, aBoolean -> {
Toast.makeText(this, "${aBoolean}", Toast.LENGTH_SHORT).show();
});
LiveData
サブクラスがありMutableLiveData
、内部value
プロパティが最新の値、サブスクリプションを保持LiveData
変更、直接電話をLiveData.observe()
:
公共観察無効(@NonNull LifecycleOwner所有者、@NonNullオブザーバーはオブザーバー<スーパーT?>)
所有者:登録期間は、時に所有者、アンバンドリングオブザーバー破壊されます。
オブザーバー:コールバック関数の観測値が変更されました
owner
直接使用するActivity
か、Fragment
することができます。あなたが理解していない場合はLifecycle
使用を、あなたは、関連する情報を見ることができます。
概要
最後に、私は何を最新にまとめ、図アーキテクチャを描いたMVVM
アーキテクチャを使用します:
Activity
:との契約UI
問題は、しかし、そうするために可能な限り一貫して使用として避けるべきですDataBinding
。
ViewModel
:保存ページでは、複雑な機能は、複数の単語に分割することができ、データを必要とします。
DataBinding
:処理UI
ビュー、保留ViewModel
データ表示のために。ページの機能は、より複雑な場合、それができるViewModel
とDataBinding
再び細分化。
最後に何かを言うために
私は私のGitHubと遊ぶために、関連するコンテンツへのアクセスを、私のAndroidのコア技術の学習シラバスを囲みますhttps://github.com/Meng997998/AndroidJX
この方法を進めたために、学習が報われる!
あなたが学習に投資するあなたの時間を取る、それはあなたが、スキルを獲得し、収益を増加させる機会を持つことができることを意味します。
ここに私のAndroidのPDF Daquanのは、このAndroidのPDF Daquanのは、本当にすべての側面を含んで学ぶ、学ぶことを学ぶ共有し、コレクションアルゴリズムのように基本的なJavaの知識、アンドロイド、Androidの高度な拡張の基礎とするが含まれています
マイコレクション本研究では、効果的にあなたが知識ポイントを把握するのに役立つことができます。
要するに、私たちは、高度な学習強化ここで助けにもありますが、またあなたは、オンライン検索データを学習する時間を節約するにも一緒に勉強親しい友人と共有することができます