使用注意点
LiveData与ViewModel一般都是配合着一起使用。
第一步:创建ViewModel类
package com.example.jetpackdemo03;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class NameViewModel extends ViewModel {
private MutableLiveData<String> currentName;
public int i;
public MutableLiveData<String> getCurrentName() {
if (currentName == null) {
currentName = new MutableLiveData<>();
}
return currentName;
}
}
第二步:实例化 ViewModel 、创建监听者、绑定监听者
package com.example.jetpackdemo03;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private NameViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
Button btn = findViewById(R.id.btn);
TextView tv = findViewById(R.id.tv);
// ViewModel 实例的创建
ViewModelProvider.AndroidViewModelFactory instance = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
model = new ViewModelProvider(this, instance).get(NameViewModel.class);
//需要一个观察者来观察数据
Observer observer = new Observer<String>() {
@Override
public void onChanged(String string) {
tv.setText(string);
}
};
//订阅
model.getCurrentName().observe(this, observer);
//设置点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
model.getCurrentName().setValue("wustyq" + (model.i++));
}
});
}
}
优化 LiveData 的管理
- 使用单例模式
package com.example.jetpackdemo03;
import androidx.lifecycle.MutableLiveData;
import java.util.HashMap;
import java.util.Map;
public class LiveDataBus {
//存放订阅者
private Map<String, MutableLiveData<Object>> bus;
private static LiveDataBus liveDataBus = new LiveDataBus();
public LiveDataBus() {
bus = new HashMap<>();
}
private static LiveDataBus getInstance() {
return liveDataBus;
}
//注册订阅者
public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) {
if (!bus.containsKey(key)) {
bus.put(key, new MutableLiveData<Object>());
}
return (MutableLiveData) bus.get(key);
}
}