项目是组件化模式,这里记录下项目消息总站设计思路
目录
[2、Viewmodel 模式](#2、Viewmodel 模式)
[3、LiveDataBus 模式](#3、LiveDataBus 模式)
[3、EventBus 模式](#3、EventBus 模式)
1、接口模式
消息总站:MessageCenter 单利模式
public class MessageCenter {
private static MessageCenter instance;
private final List<Notifiable> observers = new ArrayList<>();
private MessageCenter() {
}
public static synchronized MessageCenter getInstance() {
if (instance == null) {
instance = new MessageCenter();
}
return instance;
}
public void addObserver(Notifiable observer) {
observers.add(observer);
}
public void removeObserver(Notifiable observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Notifiable observer : observers) {
observer.onNotify(message);
}
}
}
Notifiable 接口
public interface Notifiable {
void onNotify(String message);
}
使用:
发送消息
MessageCenter.getInstance().notifyObservers("测试消息");
接收消息
实现接口:implements Notifiable
添加观察者:MessageCenter.getInstance().addObserver(this);
实现回调方法:
@Override
public void onNotify(String message) {
}
2、Viewmodel 模式
使用 LiveData
和 Lifecycle
来实现消息中心
实现步骤:
定义消息中心
public class MessageViewModel extends ViewModel {
private final MutableLiveData<String> message = new MutableLiveData<>();
public void sendMessage(String msg) {
message.setValue(msg);
}
public LiveData<String> getMessage() {
return message;
}
}
为了在应用程序级别共享 ViewModel
,我们需要定义一个 ViewModelProvider.Factory
public class ViewModelFactory implements ViewModelProvider.Factory {
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(MessageViewModel.class)) {
return (T) new MessageViewModel();
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
创建一个单例类来管理 ViewModelProvider
,以便在组件化模式下使用
public class ViewModelProviderManager implements ViewModelStoreOwner {
private static ViewModelProviderManager instance;
private final ViewModelStore viewModelStore = new ViewModelStore();
private final ViewModelProvider.Factory factory;
private ViewModelProviderManager(Application application) {
this.factory = new ViewModelFactory();
}
public static synchronized ViewModelProviderManager getInstance(Application application) {
if (instance == null) {
instance = new ViewModelProviderManager(application);
}
return instance;
}
@Override
public ViewModelStore getViewModelStore() {
return viewModelStore;
}
public ViewModelProvider.Factory getFactory() {
return factory;
}
}
使用:
创建messageViewModel
messageViewModel = new ViewModelProvider( ViewModelProviderManager.getInstance(AppProvider.getInstance().getApp()),
ViewModelProviderManager.getInstance(AppProvider.getInstance().getApp()).getFactory()
).get(MessageViewModel.class);
发送消息
messageViewModel.sendMessage("测试消息");
接收消息
MessageViewModel messageViewModel = new ViewModelProvider( ViewModelProviderManager.getInstance(AppProvider.getInstance().getApp()),
ViewModelProviderManager.getInstance(AppProvider.getInstance().getApp()).getFactory()
).get(MessageViewModel.class);
messageViewModel.getMessage().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
}
});
3、LiveDataBus 模式
使用:
发送消息
LiveDataBus.get().with("key_test").setValue("123456");
接收消息
LiveDataBus.get()
.with("key_test", String.class)
.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
}
});
3、EventBus 模式
使用:
注册
EventBus.getDefault().register(this);
@Subscribe(threadMode = ThreadMode.POSTING)
public void onLocationMessageEvent(LocationMessageEvent event) {
}
发送
EventBus.getDefault().post(new LocationMessageEvent(location));
粘性事件
EventBus.getDefault().postSticky(new LocationMessageEvent(location))}