0
点赞
收藏
分享

微信扫一扫

ViewModel与LiveData的简单使用


使用注意点

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);
}
}


举报

相关推荐

0 条评论