Android 在 onDataSetChanged 有时间处理数据之前适配器格式化布局
Android Adapter formats layout before onDataSetChanged has had time to process the data
我正在实现 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
在数据准备好之前尝试处理布局?
简短回答:只需在 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(),你就已经有了所有的数据现在为您的远程视图列表。
我正在实现 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
在数据准备好之前尝试处理布局?
简短回答:只需在 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(),你就已经有了所有的数据现在为您的远程视图列表。