我真的很难选择正确的方法将数据从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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)