Android MVVM:观察广播接收器的数据库变化



在我的应用程序中,我需要从广播接收器添加/删除/更新数据库中的数据。我想知道这方面的最佳实践是什么。由于 onReceive 是在主线程上调用的,因此我需要一种方法在工作线程上运行查询,并且在完成时我需要 onReceive 方法中的响应。

为此,我使用了像这样的简单观察者模式。

public class NetworkChangeReceiver extends BroadcastReceiver implements IDbUpdateListener{
private MyRepository repo;
private Application application;
@Override
public void onReceive(Context context, Intent intent) {
//Some conditions
//Initializing and setting listener for repo
respo = new MyRepository(this); //this is the listener interface
repo.getAllContents();
}
}
}
//Interface method implemented
@Override
public void onDbUpdate(Content content) {
//Do something with the data
}
}

我将侦听器传递给存储库,在那里我在侦听器上调用 onDbUpdate(( 方法,从而在接收器中获取响应。

如果它是一个活动/片段而不是广播接收器,我会简单地使用一个带有实时数据的视图模型作为可观察对象,在我的活动中,我会观察视图模型的更改,如下所示的变化

mViewModel.getAllContent().observe(this, new Observer<List<Content>>() {
@Override
public void onChanged(@Nullable final List<Content> contents) {
// Do something
}
});

我的方法可以吗,还是有明显更好的方法来在广播接收器中实现这一目标?谢谢!!

我相信你应该使用某种可以为你处理任务的管理器。

Android目前有一个库工作管理器可以很好地处理这个问题。

使用WorkManager您可以安排OneTimeWorkRequestPeriodicWorkRequest

另一个好处是,您不必自己侦听连接状态,因为您可以在传递给WorkManager的约束中指定/配置此状态以及许多其他状态。

val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.build() 

是的,如果网络非常糟糕,它还可以通过简单地指定一个backOffCriteria来处理重试。

val workRequest = OneTimeWorkRequest.Builder(RequestWorker::class.java)
.setInputData(mapOf("record_id" to recordId).toWorkData())
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
.build()

如果您也对任务/工作的状态感兴趣,可以通过调用getStatusById(workId)来观察LiveData<WorkStatus>

最新更新