Android MVVM: Наблюдение за изменениями базы данных с приемника вещания - PullRequest
0 голосов
/ 14 сентября 2018

В моем приложении мне нужно добавить / удалить / обновить данные в моей БД из BroadcastReceiver.Мне интересно, каковы лучшие практики в этом отношении.Поскольку onReceive вызывается в главном потоке, мне нужен способ запуска запросов в рабочем потоке, а по завершении мне нужен ответ в методе onReceive.

Для этого я использовал простой шаблон Observer, такой какthis.

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 () на слушателе и тем самым получаю ответ в получателе.

Если это было действие /фрагмент вместо приемника вещания, я бы просто использовал viewModel с живыми данными в качестве наблюдаемой, и в своей деятельности я бы наблюдал модель просмотра для изменений вроде этого

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

Мой подход в порядке или естьочевидный лучший способ достижения этого в BroadcastReceiver?Спасибо !!

1 Ответ

0 голосов
/ 14 сентября 2018

Я считаю, что вы должны использовать какой-то менеджер, который может справиться с задачей за вас.

У Android в настоящее время есть библиотека Диспетчер работы , которая прекрасно справляется с этим.

С WorkManager вы можете запланировать OneTimeWorkRequest или PeriodicWorkRequest.

Еще одним преимуществом является то, что вам необязательно самостоятельно прослушивать состояние подключения, поскольку вы можете указать / настроить это и многие другие в ограничениях, передаваемых 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()

Если вас также интересует состояние задания / работы, вы можете наблюдать LiveData<WorkStatus>, позвонив по номеру getStatusById(workId)

...