Android ViewModelの使用
6101 ワード
ViewModelの役割は、インタフェースのためにデータを準備することであり、データの取得操作(ネットワーク要求など)や一部のデータ処理は、このクラスでメソッドを記述し、Activityでのコードを減らすことができる.
ViewModelのデータは、以下の3つに分類されます.普通のデータ、ただデータを保存することを担当して、特別な作用がなくて、普通のクラスとして を使うことができますは、LiveDataと組み合わせて使用されます.MutableLiveDataの取/付与方法は、それぞれgetValue(),setValue()であり、メインスレッドにない場合はpostValue()である.LiveDataについては、私のもう一つの記事Android LiveDataの使用 を参照してください.はDataBindingと組み合わせて使用され、ObservableFieldにはget/setメソッドが付属しています.DataBindingの使用は私のもう一つの文章Android DataBindingの簡単な使用 を見ることができます.
この3種類を使い分けることもできるし、ニーズに合わせて使うこともできます.ViewModelのエンティティオブジェクトを取得するには、以下の作成方法が提供されています(私がこの文章を発表したとき、中国語の公式サイトに表示されている方法は旧版で、以下のコードはすでに修正された最新の方法で、旧版の方法は捨てられています.以降のバージョンの更新で新しい作成方法がないことは保証できません.後でコードが間違っていることを発見したら、公式サイトに行って最新のコードを見ることができます).この方法で取得したViewModelは、Activityが最初に作成されたときにのみ作成され、その後、以前に作成したViewModelが多重化され、ページステータスの保存に使用されます. この方法で取得したViewModelは、毎回再作成されます(個人的な感覚はnew DataViewModel()を直接使うのと変わらず、異なる観点の歓迎指摘があります).
ViewModelを統一的に管理するために、次のツールクラスを書きました.すべてのViewModelはこのクラスの方法で作成できます(アプリケーションのクラスに入れることもできます).getPrivateViewModel()は、上記の方法1に対応します.getView Model()は、上記の方法2に対応し、1つの静的mapに格納され、複数のページが同じView Modelのデータを共有できるようになる.
ViewModelのデータは、以下の3つに分類されます.
public class DataViewModel extends ViewModel {
public String name;
public int age;
}
public class DataViewModel extends ViewModel {
private MutableLiveData name;
private MutableLiveData age;
public MutableLiveData getName() {
if (name == null) {
name = new MutableLiveData();
// , ""。
}
return name;
}
public MutableLiveData getAge() {
if (age == null) {
age = new MutableLiveData();
// , 0。
}
return age;
}
}
/**
* MutableLiveData? ObservableField?
* , 。 , 。
* MutableLiveData , , ObservableField ( ),
* MutableLiveData, onChanged ( activity )
* :
* 1、 ( , )/ ( XML , ) , ObservableField
* 2、 MutableLiveData
*/
public class DataViewModel extends ViewModel {
public final ObservableField name = new ObservableField<>();
public final ObservableField age = new ObservableField<>();
}
この3種類を使い分けることもできるし、ニーズに合わせて使うこともできます.ViewModelのエンティティオブジェクトを取得するには、以下の作成方法が提供されています(私がこの文章を発表したとき、中国語の公式サイトに表示されている方法は旧版で、以下のコードはすでに修正された最新の方法で、旧版の方法は捨てられています.以降のバージョンの更新で新しい作成方法がないことは保証できません.後でコードが間違っていることを発見したら、公式サイトに行って最新のコードを見ることができます).
public class MyActivity extends AppCompatActivity {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
public void onCreate(Bundle savedInstanceState) {
ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
DataViewModel dataViewModel = new ViewModelProvider(this, factory).get(DataViewModel.class);
}
}
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
DataViewModel dataViewModel = factory.create(DataViewModel.class);
}
}
ViewModelを統一的に管理するために、次のツールクラスを書きました.すべてのViewModelはこのクラスの方法で作成できます(アプリケーションのクラスに入れることもできます).getPrivateViewModel()は、上記の方法1に対応します.getView Model()は、上記の方法2に対応し、1つの静的mapに格納され、複数のページが同じView Modelのデータを共有できるようになる.
import android.app.Activity;
import android.app.Application;
import java.util.HashMap;
import java.util.Map;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
/**
* ViewModel
*/
public class ViewModelUtils {
private static Map viewModelMap = new HashMap<>();
/**
* ViewModel
* ( ), ViewModel MutableLiveData observe,
* ViewModel MutableLiveData , ( , ), onChanged() ( )
* @param application application
* @param viewModelClass ViewModel
* @param
* @return
*/
public static T getViewModel(Application application, Class viewModelClass){
if (viewModelMap.containsKey(viewModelClass)){
return (T) viewModelMap.get(viewModelClass);
}
T t = ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(viewModelClass);
viewModelMap.put(viewModelClass, t);
return t;
}
public static T getViewModel(Fragment fragment, Class viewModelClass){
return getViewModel(fragment.getActivity(),viewModelClass);
}
public static T getViewModel(Activity activity, Class viewModelClass){
return getViewModel(activity.getApplication(),viewModelClass);
}
/**
* ViewModel( , )
* @param application application
* @param viewModelClass ViewModel
* @param owner AppCompatActivity Fragment
* @return
*/
public static T getPrivateViewModel(Application application, Class viewModelClass,ViewModelStoreOwner owner){
ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
return new ViewModelProvider(owner, factory).get(viewModelClass);
}
public static T getPrivateViewModel(Activity activity, Class viewModelClass,ViewModelStoreOwner owner){
return getPrivateViewModel(activity.getApplication(),viewModelClass,owner);
}
public static T getPrivateViewModel(Fragment fragment, Class viewModelClass,ViewModelStoreOwner owner){
return getPrivateViewModel(fragment.getActivity(),viewModelClass,owner);
}
}