viewmodel----02----viewmodel跟liveData结合使用才最好

LiveData和ViewModel的关系

在ViewModel中的数据发生变化时通知页面

 

 

 

一个小例子,每一秒加1

 

 

MyViewModel.class
public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> currentSecond;

    public MutableLiveData<Integer> getCurrentSecond() {
        if (currentSecond == null){
            currentSecond = new MutableLiveData<>();
            currentSecond.setValue(0);
        }
        return currentSecond;
    }
}
View Code

 

MainActivity
public class MainActivity extends AppCompatActivity {

    TextView textView;
    MyViewModel myViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        //获取ViewModel
        myViewModel = new ViewModelProvider(this,new ViewModelProvider
                .AndroidViewModelFactory(getApplication()))
                .get(MyViewModel.class);

        textView.setText(String.valueOf(myViewModel.getCurrentSecond().getValue()));

        //一秒加一个数
        startTimer();

        myViewModel.getCurrentSecond().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(myViewModel.getCurrentSecond().getValue()));
                if (myViewModel.getCurrentSecond().getValue() == 99){
                    textView.setText(String.valueOf(0));
                }
            }
        });

    }

    private void startTimer() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                //非UI线程 用 postValue
                //UI线程 用 setValue
                myViewModel.getCurrentSecond().postValue(myViewModel.getCurrentSecond().getValue()+1);
            }
        },2000,1000);  //2000毫秒后开始执行   period:每隔1000毫秒跑一下这个线程
    }
}
View Code
 

第二个小例子,简单的应用:ViewModel+LiveData 两个fragment间的通信

 

MyViewModel

public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> progress;

    public MutableLiveData<Integer> getProgress() {
        if (progress == null){
            progress = new MutableLiveData<>();
            progress.setValue(0);
        }
        return progress;
    }
}

 

fragment1

public class BlankFragment extends Fragment {

    SeekBar seekBar1;
    MyViewModel myViewModel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.fragment_blank, container, false);

        seekBar1 = inflate.findViewById(R.id.seekBar);

        //获取ViewModel
        myViewModel = new ViewModelProvider(getActivity(),new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(MyViewModel.class);
        myViewModel.getProgress().observe(getActivity(), new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                seekBar1.setProgress(integer);
            }
        });

        seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                myViewModel.getProgress().setValue(seekBar.getProgress());
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        return inflate;
    }
}
View Code

 

fragment2

public class BlankFragment2 extends Fragment {

    SeekBar seekBar2;
    MyViewModel myViewModel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View inflate = inflater.inflate(R.layout.fragment_blank2, container, false);

        //获取ViewModel
        myViewModel = new ViewModelProvider(getActivity(),new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(MyViewModel.class);
        myViewModel.getProgress().observe(getActivity(), new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                seekBar2.setProgress(integer);
            }
        });

        seekBar2 = inflate.findViewById(R.id.seekBar2);
        seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        return inflate;
    }
}
View Code

 

mainactivity

 

 

 

public class MainActivity extends AppCompatActivity {

    TextView textView2;
    MyViewModel myViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView2 = findViewById(R.id.textView2);
        //获取ViewModel
        myViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
        myViewModel.getProgress().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView2.setText(myViewModel.getProgress().getValue().toString());
            }
        });
    }

}

 

posted @ 2021-11-26 17:06  涂妖教  阅读(119)  评论(0)    收藏  举报