android– 在Viewmodel中访问BroadCastReceiver

android– 在Viewmodel中访问BroadCastReceiver,第1张

概述我真的很难选择正确的方法将数据从broadcastReceiver传递到ViewModel,并从那里我将数据传递给我的存储库并更新LiveData.我使用FCM推送通知,并使用ActivityLifecycle的本地broadCastReceiver.我发现从BroadcastReceiver访问ViewModel是不好的做法,但不确定为什么?如果我管理broadcas

我真的很难选择正确的方法将数据从broadcastReceiver传递到viewmodel,并从那里我将数据传递给我的存储库并更新liveData.我使用FCM推送通知,并使用Activitylifecycle的本地broadCastReceiver.我发现从broadcastReceiver访问viewmodel是不好的做法,但不确定为什么?如果我管理broadcastReceiver的生命周期,它不应该导致任何问题……那么将接收到的数据从FCM传递到我的Repository的MediatorliveData的最佳方法是什么?我使用MediatorliveData,因为我添加了不同的liveData源(API请求和FCM).将不胜感激的建议和实施broadCastReceiver的正确方法.
我考虑过从broadCastReceiver访问Repository,如下所示:

RepositoryMain.getSingletonInstance()setResponse(状态).

解决方法:

您需要定义单一事实来源(SSoT).在你的情况下它是Repository(如果Repository封装了db持久性存储,SSoT就是db).现在您需要实现从接收器到通过SSoT(Repository)查看的数据流,如下例所示:

接收器实施

public class FcmReceiver extends broadcastReceiver {    private final mutablelivedata<MyData> mData = new mutablelivedata<>();    public liveData<MyData> getData() {        return mData;    }    @OverrIDe    public voID onReceive(Context context, Intent intent) {        // entry point of data        mData.setValue(new MyData());    }}

知识库

public class Repository {    private static final Repository INSTANCE = new Repository();    private final MediatorliveData<MyData> mData = new MediatorliveData<>();    private Repository() {}    public static Repository instance() {        return INSTANCE;    }    public liveData<MyData> getData() {        return mData;    }    public voID addDataSource(liveData<MyData> data) {        mData.addSource(data, mData::setValue);    }    public voID removeDataSource(liveData<MyData> data) {        mData.removeSource(data);    }}

查看模型

public class Myviewmodel extends viewmodel {    public liveData<MyData> getData() {        // for simplicity return data directly to vIEw        return Repository.instance().getData();    }}

活动

接收器数据和存储库有绑定

public class MainActivity extends AppCompatActivity {    private FcmReceiver mReceiver;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mReceiver = new FcmReceiver();    }    @OverrIDe    protected voID onStart() {        super.onStart();        // add data source        Repository.instance().addDataSource(mReceiver.getData());        registerReceiver(mReceiver, IntentFilter.create("action", "type"));    }    @OverrIDe    protected voID onStop() {        super.onStop();        // don't forget to remove receiver data source        Repository.instance().removeDataSource(mReceiver.getData());        unregisterReceiver(mReceiver);    }}
总结

以上是内存溢出为你收集整理的android – 在Viewmodel中访问BroadCastReceiver全部内容,希望文章能够帮你解决android – 在Viewmodel中访问BroadCastReceiver所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1112496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存