Android ViewModelの使用

6101 ワード

ViewModelの役割は、インタフェースのためにデータを準備することであり、データの取得操作(ネットワーク要求など)や一部のデータ処理は、このクラスでメソッドを記述し、Activityでのコードを減らすことができる.
ViewModelのデータは、以下の3つに分類されます.
  • 普通のデータ、ただデータを保存することを担当して、特別な作用がなくて、普通のクラスとして
    public class DataViewModel extends ViewModel {
        public String name;
        public int age;
    }
  • を使うことができます
  • は、LiveDataと組み合わせて使用されます.MutableLiveDataの取/付与方法は、それぞれgetValue(),setValue()であり、メインスレッドにない場合はpostValue()である.LiveDataについては、私のもう一つの記事Android LiveDataの使用
    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;
        }
    }
  • を参照してください.
  • はDataBindingと組み合わせて使用され、ObservableFieldにはget/setメソッドが付属しています.DataBindingの使用は私のもう一つの文章Android DataBindingの簡単な使用
    /**
     *       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のエンティティオブジェクトを取得するには、以下の作成方法が提供されています(私がこの文章を発表したとき、中国語の公式サイトに表示されている方法は旧版で、以下のコードはすでに修正された最新の方法で、旧版の方法は捨てられています.以降のバージョンの更新で新しい作成方法がないことは保証できません.後でコードが間違っていることを発見したら、公式サイトに行って最新のコードを見ることができます).
  • この方法で取得したViewModelは、Activityが最初に作成されたときにのみ作成され、その後、以前に作成した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);
        }
    }
  • この方法で取得したViewModelは、毎回再作成されます(個人的な感覚はnew DataViewModel()を直接使うのと変わらず、異なる観点の歓迎指摘があります).
    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);
        }
    }