Android 消息总站 设计思路

项目是组件化模式,这里记录下项目消息总站设计思路

目录

1、接口模式

[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 模式

使用 LiveDataLifecycle 来实现消息中心

实现步骤:

定义消息中心

复制代码
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))}
相关推荐
消失的旧时光-194311 分钟前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon1 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon1 小时前
VSYNC 信号完整流程2
android
dalancon1 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013842 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android3 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才3 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶4 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙4 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github
qq_283720055 小时前
MySQL技巧(四): EXPLAIN 关键参数详细解释
android·adb