一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して14日目です。クリックしてイベントの詳細をご覧ください。
この記事では、主にViewModelを使用するための基本的なスキルについて説明します
1.ViewModelコンストラクターは着信アプリケーションをサポートします
ViewModelの継承をカスタマイズしAndroidViewModel
ます:
class ApplicationViewModel(app: Application) : AndroidViewModel(app) {
//获取Applicaction
private val mApp: Application by lazy {
getApplication()
}
}
复制代码
getApplication()
メソッドを介してアプリケーションを取得できます。
2. ViewModelコンストラクターは、他の型パラメーターの受け渡しをサポートします
ViewModelは、特定のViewModelタイプを作成するためのファクトリクラスの受け渡しをサポートしているため、カスタムファクトリクラスを直接継承ViewModelProvider.Factory
し、ViewModelを作成するときにカスタムファクトリクラスを渡します。
たとえば、MainViewModel
サポートする次の構築パラメーターは、Int型で渡します。
class CustomVMFactory(
private val factory: ViewModelProvider.Factory,
private val type: Int
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(type) as T
}
return factory.create(modelClass)
}
}
复制代码
カスタムCustomVMFactory
ファクトリクラスもActivityを渡して、默认工厂
カスタムファクトリクラスがViewModelを作成できない場合に、元のActivityデフォルトファクトリに渡されて処理されるようにする必要があることがわかります。これは、1つ兜底作用
に相当します。基本的に静的プロキシパターンの実装を反映しています。
次のように使用します。
private val mVM by viewModels<MainViewModel> {
CustomVMFactory(
defaultViewModelProviderFactory,
5
)
}
复制代码
3.ViewModelでのLiveDataの使用に関する注意
一般に、ViewModelでLiveDataを次のように定義します。
//私有可变
private val data: MutableLiveData<Response<String>> = MutableLiveData()
//对外暴漏不可变
val data1: LiveData<Response<String>> get() = data
复制代码
data1
追加のメンバー変数とメンバーメソッドを宣言することにより、不変性を外界に公開しました。
逆コンパイルされたコードから判断すると、実際には、追加で宣言されたプロパティはまったく必要ありませんgetData1
。不変のLiveDataを取得するためのメソッドのみが必要です。
したがって、次のように変更できます。
//对外暴漏不可变
val data1: LiveData<String> get() = MutableLiveData()
复制代码
逆コンパイルして効果を確認します。
逆コンパイルされたコードからわかるように、、暴露不可变的LiveData只额外声明了一个方法
は余分なプロパティの宣言を減らします。
4.ViewModelでのコルーチンの使用
依存関係implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
は、ViewModelのコルーチン拡張プロパティを提供します。viewModelScope
次に、viewModelScope
プロパティを直接使用して耗时操作
合計を実行でき线程切换
ます。
fun request() {
viewModelScope.launch(Dispatchers.IO) {
//执行耗时代码,比如网络请求
}
}
复制代码