Макет форматов Адаптера Android до того, как onDataSetChanged успел обработать данные - PullRequest
0 голосов
/ 04 ноября 2018

Я реализую экземпляр RemoteViewsService.RemoteViewsFactory, который управляет макетом для моего виджета. Проблема заключается в том, что данные для форматирования макетов извлекаются из базы данных и асинхронно форматируются через RxJava2.

@Override
public void onDataSetChanged() {
    Observable.doSomeLongAsyncRequestAndProcess()
        .subscribe(data -> {
            // Data is ready at this point
            // Unfortunately it's too late
        })
}


@Override
public RemoteViews getViewAt(int position) { // layout with non-existant data }

Поскольку я не контролирую (не то, что я знаю), когда макет начинает инициацию макета, как я могу остановить #getViewAt от попытки обработать макет до того, как данные будут готовы?

1 Ответ

0 голосов
/ 05 ноября 2018

Короткий ответ : просто получите ваши данные из базы данных в onDataSetChanged () без асинхронной работы. Что-то вроде:

Observable.doSomeLongAsyncRequestAndProcess()
    .subscribe(data -> {
        // Data is ready at this point
        // And after that, chain to getViewAt() will be triggered, 
        // so you will have all your data for views in time
    }).blockingFirst()

Длинный ответ : onDataSetChanged () работает с потоком подшивки, поэтому здесь будет безопасно получать данные. В обратных вызовах RemoteViewFactory только onCreate () находится в главном потоке. Вы можете легко проверить это, регистрируя текущий поток во всех обратных вызовах RemoteViewFactory. Так что проблем больше не будет, после выполнения onDataSetChanged () , он вызовет цепочку getViewAt () , и у вас уже будут все данные для вашего списка удаленных просмотров на данный момент. enter image description here

...