Android MVVM:从广播接收器观察数据库变化
Android MVVM: Observing database changes from broadcast receiver
在我的应用程序中,我需要 add/remove/update 来自 BroadcastReceiver 的数据库中的数据。我想知道这方面的最佳做法是什么。由于在主线程上调用了 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() 方法,从而在接收器中获得响应。
如果它是 activity/fragment 而不是广播接收器,我会简单地使用带有实时数据的 viewModel 作为可观察对象,在我的 activity 中,我会观察 viewmodel 的变化,例如这个
mViewModel.getAllContent().observe(this, new Observer<List<Content>>() {
@Override
public void onChanged(@Nullable final List<Content> contents) {
// Do something
}
});
我的方法是否可行,或者是否有在 BroadcastReceiver 中实现此目的的明显更好的方法?谢谢!!
我相信你应该使用某种可以为你处理任务的经理。
Android 目前有一个库 Work Manager 可以很好地处理这个问题。
使用 WorkManager
,您可以安排 OneTimeWorkRequest
或 PeriodicWorkRequest
。
另一个好处是您不必自己监听连接状态,因为您可以 specify/configure 这和传递给 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()
如果您也对task/work的状态感兴趣,可以通过调用getStatusById(workId)
观察LiveData<WorkStatus>
在我的应用程序中,我需要 add/remove/update 来自 BroadcastReceiver 的数据库中的数据。我想知道这方面的最佳做法是什么。由于在主线程上调用了 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() 方法,从而在接收器中获得响应。
如果它是 activity/fragment 而不是广播接收器,我会简单地使用带有实时数据的 viewModel 作为可观察对象,在我的 activity 中,我会观察 viewmodel 的变化,例如这个
mViewModel.getAllContent().observe(this, new Observer<List<Content>>() {
@Override
public void onChanged(@Nullable final List<Content> contents) {
// Do something
}
});
我的方法是否可行,或者是否有在 BroadcastReceiver 中实现此目的的明显更好的方法?谢谢!!
我相信你应该使用某种可以为你处理任务的经理。
Android 目前有一个库 Work Manager 可以很好地处理这个问题。
使用 WorkManager
,您可以安排 OneTimeWorkRequest
或 PeriodicWorkRequest
。
另一个好处是您不必自己监听连接状态,因为您可以 specify/configure 这和传递给 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()
如果您也对task/work的状态感兴趣,可以通过调用getStatusById(workId)
LiveData<WorkStatus>