ViewModel是视图与数据模型之间的桥梁
LiveData可以理解为当数据发生改变的时候,通过LiveData通知UI视图进行更新主线程页面
activity代码
package com.nyw.viewmodeldemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.nyw.viewmodeldemo.model.MyViewModel;
import java.util.Timer;
import java.util.TimerTask;
/**
* 使用viewModel实现计数累加,数据保存到viewModel里,竖屏或横屏切换保存数据不变
* ViewModel 不受生命周期影响,以Map形式保存数据
* 不要向ViewModel中传入Content 会导致内存泄漏,如果要使用Content,就使用AndroidViewModel中的Application,也就是说MyViewModel自定义要换成继承AndroidViewModel实现方法,可以使用application
* 例如MyAndroidViewModel
* myViewModel数据更新,通过LiveData通知ui进行更新数据显示
*/
public class MainActivity extends AppCompatActivity {
private TextView textView,textView_msg;
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myViewModel=new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
textView=findViewById(R.id.textView);
textView.setText(myViewModel.number+"");
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText((++myViewModel.number)+"");
}
});
textView_msg=findViewById(R.id.textView_msg);
//LiveData
textView_msg.setText(myViewModel.getCurrentSecong().getValue().toString());
//监听ViewModel值发生变化,就执行更新UI
myViewModel.getCurrentSecong().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
//更新UI
textView_msg.setText(integer.toString());
}
});
startTimer();
}
/**
* 每1秒修改一次viewModel值
*/
private void startTimer() {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//ui线程使用setValue
//非UI线程用 postValue
myViewModel.getCurrentSecong().postValue(myViewModel.getCurrentSecong().getValue()+1);
}
},1000,1000);
}
}
package com.nyw.viewmodeldemo.model;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
public int number;
private MutableLiveData<Integer> currentSecond;
//LiveData使用,创建一个方法,new 一个LiveData对象并且返回对象使用
public MutableLiveData<Integer> getCurrentSecong(){
if (currentSecond==null){
currentSecond=new MutableLiveData<>();
//设置一个默认值
currentSecond.setValue(0);
}
return currentSecond;
}
}
?
|