我确实在选择正确的方法来将数据从broadcastReceiver传递到ViewModel,然后从那里将数据传递到我的存储库并更新LiveData。我使用FCM推送通知,并具有使用ActivityLifecycle的本地broadCastReceiver。我发现从BroadcastReceiver访问ViewModel是不好的做法,但是不确定为什么吗?如果我管理broadcastReceiver的生命周期,应该不会造成任何问题... 那么将接收到的数据从FCM传递到存储库的MediatorLiveData的最佳方法是什么?我使用MediatorLiveData,因为我添加了不同的LiveData源( API请求和FCM)。感谢提供建议和正确的方式来实现broadCastReceiver。 我曾考虑过从BroadCastReceiver访问存储库,如下所示:
RepositoryMain.getSingletonInstance()。setResponse(state);
答案 0 :(得分:8)
您需要定义单个事实来源( SSoT )。就您而言,它Repository
(如果Repository
封装了数据库持久性存储,则 SSoT 是数据库)。现在,您需要实现从接收器实现的数据流,以通过 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();
}
}
接收方数据和Repository
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);
}
}
答案 1 :(得分:0)
我认为您不需要访问视图模型中的 BroadCastReceiver。或者,使用 BroadCastReceiver 在 Activity 之间移动数据,如果您想对数据执行任何逻辑,请将其发送到与该 Activity 相关的 viewModel。
简单来说:
假设我们有以下组件:
ActivityOne 观察 ViewModelOne
ActivityTwo 观察 ViewModelTwo
BroadCastReceiver [从 ActivityOne 发送操作]。 ActivityTwo 监听这些动作
一旦ActivityOne从viewModelOne接收到数据,它就会通过BroadCastReceiver发送数据。
ActivityTwo 已经注册了 BroadCastReceiver,因此它接收这些动作,如果它需要对数据做任何逻辑,它可以将它发送到 >ViewModelTwo。