Androidアーキテクチャコンポーネントについて知っておくべきことすべて

公開: 2022-01-02

アーキテクチャコンポーネント

アーキテクチャは安定した計画であり、開発プロセスを開始する前に作成する必要があります。 アーキテクチャコンポーネントは、アプリケーションを整理し、すべてのコンポーネントを結び付け、堅牢で検証可能で保守可能なアプリケーションの設計に役立つライブラリのコレクションを提供します。 Androidの新しいアーキテクチャは、セキュリティを備えた理想的なアプリケーションを作成し、保守とテストが困難な肥大化したクラスを回避するためのいくつかの重要な原則を示唆しています。

ビルディングブロック

ビルディングブロックの基本的な例は、アクティビティ、ビュー、インテント、サービス、フラグメント、マニフェストファイル、AVD(Android仮想デバイス)です。 これらのブロックは、合理的なアプリケーションのコンポーネントアーキテクチャを表しており、開発者の問題点の印でもあります。

最初のセットはあなたを助けます

  • アクティビティとフラグメントのライフサイクルを自動的に管理して、メモリとリソースのリークを回避します
  • JavaデータオブジェクトをSQLiteデータベースに永続化する

コンポーネント:

1.ライフサイクルコンポーネント

このコンポーネントは、ライフサイクルの認識を追加するために使用されます。 ライフサイクルコンポーネントには、Lifecycle、LifecycleOwner、LifecycleObserverが含まれます

ライフサイクル

これまでのところ、ライフサイクルはシステム自体によって管理される抽象クラスです。 ただし、現在のシナリオでは、ライフサイクルはコンポーネントの状態を識別し、適切なタイミングでそれに応じてタスクを動作および終了します。

LifecycleOwner

LifecycleOwnerは、getLifecycle()メソッドからライフサイクルオブジェクトを取得するために実装できるインターフェイスです。 ProcessLifecycleOwnerは、プロセス全体のライフサイクルを管理する場合に役立ちます。

LifecycleObserver

LifecycleObserverは、ActivitiesやFragmentsなどのLifecycleOwnerコンポーネントを監視します。 LifecycleOwner.Eventを受け取り、アノテーションメソッドを介してそれらに反応します。

これをすべて一緒に実装することで、ライフサイクル対応のアプリケーションを作成できます。

  • ライフサイクルオブザーバーの実装

パブリッククラスTestObserverはLifecycleObserverを実装します{

public MyObserver(ライフサイクルライフサイクル){

//ライフサイクル監視を開始します

lifecycle.addObserver(this);

..。

}

//関連するライフサイクルがこれらのイベントを通過するときに呼び出されるアノテーション付きメソッド

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public void onResume(){

}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void onPause(){

}

}

これで、次の実装を使用して、アプリコンポーネントでこのオブザーバーを使用できます。TestObserverobserver= new TestObserver(aLifecycleOwner.getLifecycle());

2. LiveData

LiveDataコンポーネントは、監視可能な値を含むデータホルダーです。 livedataを使用すると、アクティビティまたはフラグメントが更新されるたびに通知が届くため、UIは常に更新されます。 これは、典型的なモデルのラッパーであり、そのモデルで何かが変更されたときにオブザーバーに通知します。 livedataの主な利点は、存在しないビューによるメモリリークやNullPointerExceptionsが発生しないことです。

  • LiveDataオブジェクトを作成する

パブリッククラスMyViewModelはViewModelを拡張します{
//文字列を使用してLiveDataを作成します
private MutableLiveData <String> mData;
public MutableLiveData <String> getData(){
if(mData == null){
mData = new MutableLiveData <String>();
}
mDataを返します。
}
}
  • LiveDataオブジェクトを観察する

次のコードは、LiveDataオブジェクトを監視する方法を示しています。
パブリッククラスMyActivityはAppCompatActivityを拡張します{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel .class);
model.getData()。observe(this、data-> {
// UIを更新します
});
}
}

3.モデルを表示

ViewModelは、ライフサイクルを意識した方法でUIコンポーネント(アクティビティまたはフラグメント)のデータを提供および維持するのに役立ちます。 構成の変更を通じて存続することができます。 したがって、アクティビティを破棄したり、電話の向きを変更したりしても、ViewModelとデータが失われることはありません。 ViewModelクラスの下に配置されるLiveDataインスタンスのため、私たちの側からの入力は必要ありません。

UIのホルダーデータのUIライフサイクルについて心配する必要はありません。 ViewModelはファクトリを介して自動的にビルドされ、自分で作成および解体を処理する必要はありません。

  • ViewModelを実装する

これは、次のサンプルコードで示されています。
パブリッククラスMyViewModelはViewModelを拡張します{
プライベートMutableLiveData <List <Students >>学生;
public LiveData <List <Students >> getStudents(){
if(students == null){
学生=新しいMutableLiveData <リスト<学生>>();
loadStudents();
}
帰国生;
}
private void loadStudents(){
//非同期操作を実行して学生をフェッチします。
}
}

次のように、アクティビティからこのリストにアクセスできます。

 パブリッククラスMyActivityはAppCompatActivityを拡張します{
public void onCreate(Bundle savedInstanceState){
//システムがアクティビティのonCreate()メソッドを初めて呼び出すときにViewModelを作成します。
//再作成されたアクティビティは、最初のアクティビティによって作成されたものと同じMyViewModelインスタンスを受け取ります。
MyViewModelモデル= ViewModelProviders.of(this).get(MyViewModel.class);
model.getStudents()。observe(this、students-> {
// UIを更新します
});
}
}

4.部屋

Roomはデータベースライブラリであり、SQLiteデータベースの優れた代替手段です。 SQLiteデータベースを使用するには、常に多くの定型文を作成する必要があります。 Modelクラスにアノテーションを追加することでデータベースを定義できます。 ライブラリは、デバイス上にアプリのデータのキャッシュを作成するのに役立ちます。 OrmLiteとよく似ています。

ルームには3つの主要なコンポーネントがあります。

a。 データベース

アプリは永続化され、リレーショナルデータであり、データベースホルダーが含まれているため、@ Databaseアノテーションが付けられたクラスへの基盤となる接続の主なアクセスポイントとして機能し、次の条件を満たす必要があります。

RoomDatabaseを拡張する抽象クラスになります。

注釈を組み込んだデータベースに接続されているエンティティのリストを含めます。

@Daoアノテーションが付けられ、引数が0の抽象メソッドを含むクラスを返します。

実行時に、Room.inMemoryDatabaseBuilder()またはRoom.databaseBuilder()を呼び出すことにより、データベースのインスタンスを取得できます。

b。 実在物

データベース内のテーブルを表します。

c。 DAO

データベースへのアクセスに使用されるメソッドが含まれています。

  • エンティティの作成

@実在物
パブリッククラスユーザー{
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
プライベート文字列firstName;
@ColumnInfo(name = "last_name")
プライベート文字列lastName;

//簡潔にするために、ゲッターとセッターは無視されます。
//ただし、Roomが機能するために必要です。
}
  • データベースを作成する

@Database(entities = {User.class}、version = 1)
パブリック抽象クラスAppDatabaseはRoomDatabaseを拡張します{
プライベート静的AppDatabaseINSTANCE;
public static AppDatabase getDatabase(Context context){
if(INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext()、AppDatabase.class、 "my_db")。build();
}
INSTANCEを返します。
}
}

このクラスは、データベースを作成し、そのインスタンスを取得するために使用されます。 次のコードを使用してデータベースを作成します。

Room.databaseBuilder(context.getApplicationContext()、AppDatabase.class、“ my_db”)。build();

  • データアクセスオブジェクトを作成する

@Daoアノテーションでクラスにアノテーションを付けます。 次に、インターフェイスで定義されたメソッドを実装するRoomによってクラス実装が生成されます(Retrofitの動作と非常によく似ています)。

 @Dao
パブリックインターフェイスUserDao {
@Query( "SELECT * FROM user")
List <ユーザー> getAll();
@Query( "SELECT * FROM user WHERE uid IN(:userIds)")
List <User> loadAllByIds(int [] userIds);

@Query( "SELECT * FROM user WHERE first_name LIKE:first AND"
+ "last_name LIKE:last LIMIT 1")
ユーザーfindByName(String first、String last);

@入れる
void insertAll(User ... users);

@消去
void delete(User user);
}

結論

この記事では、Androidアーキテクチャコンポーネントの基本的な知識を提供します。 アプリケーション開発中に開発者が直面するすべての関連する問題を解決する、新しく提案されたAndroidアーキテクチャに関連するすべてのトピックを含めるようにしました。 それでも、問題が見つかった場合は、 ElsnerTechnologyのAndroid開発者を雇うことを検討してください。