处理 viewModel 的内部 Transformations.switchMap
Dealing with inner Transformations.switchMap on a viewModel
我正在将数据从 API 加载到适配器中,当用户单击它时,它使用 DownloadManager 下载,然后我使用广播让我的 activity 知道 downloadId 和超链接(房间的唯一标识符)。
到目前为止,我一直无法弄清楚如何最好地使用同一个观察者,因为最初这只是获取数据(没有 downloadId),然后通过 downloadId 和超链接传递到存储库。到目前为止,我已经能够从存储库中以硬编码数据的形式成功地做到这一点。
我的视图模型:
@Inject
ItemViewModel(@NonNull ItemRepository itemRepository){
items = Transformations.switchMap(query, search -> {
if (search == null){
return AbsentLiveData.create();
}
// Transformations.switchMap(downloadable, inner -> {
// itemRepository.getDBItems(search, inner.getHyperlink(), inner.getDownloadId());
// });
return itemRepository.getDBItems(search, null, 0);
});
因为我无法在不执行 switchMap 的情况下从 downloadable 中获取数据,而且我无法在不返回的情况下获取 itemRepository.getDBItems,所以我被卡住了。
我的直播结果:
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == DOWNLOAD_ID){
Item i = new Item();
i.setHyperlink(resultData.getString("hyperlink"));
i.setDownloadId(resultData.getLong("downloadId"));
itemViewModel.setDownloadable(i);
}
}
查看了 Google 个示例并制作了一个对象以将其包裹在 ViewModel 中。
我的最终结果:
@Inject
ItemViewModel(@NonNull ItemRepository itemRepository){
this.itemQuery = new MutableLiveData<>();
items = Transformations.switchMap(itemQuery, input -> {
if (input.isEmpty()){
return AbsentLiveData.create();
}
return itemRepository.getDBItems(input.query, input.hyperlink, input.downloadId);
});
@VisibleForTesting
public void setItemQuery(String query, String hyperlink, long downloadId) {
ItemQuery update = new ItemQuery(query,hyperlink,downloadId);
if (Objects.equals(itemQuery.getValue(), update)) {
return;
}
itemQuery.setValue(update);
}
@VisibleForTesting
static class ItemQuery{
public final String query;
public final String hyperlink;
public final long downloadId;
ItemQuery(String query, String hyperlink, long downloadId) {
this.query = query;
this.hyperlink = hyperlink;
this.downloadId = downloadId;
}
boolean isEmpty() {
return query == null;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ItemQuery itemQuery = (ItemQuery) o;
if (query != null ? !query.equals(itemQuery.query) : itemQuery.query != null) {
return false;
}
return hyperlink != null ? hyperlink.equals(itemQuery.hyperlink) : itemQuery.hyperlink == null;
}
}
似乎符合我的预期目的。
我正在将数据从 API 加载到适配器中,当用户单击它时,它使用 DownloadManager 下载,然后我使用广播让我的 activity 知道 downloadId 和超链接(房间的唯一标识符)。
到目前为止,我一直无法弄清楚如何最好地使用同一个观察者,因为最初这只是获取数据(没有 downloadId),然后通过 downloadId 和超链接传递到存储库。到目前为止,我已经能够从存储库中以硬编码数据的形式成功地做到这一点。
我的视图模型:
@Inject
ItemViewModel(@NonNull ItemRepository itemRepository){
items = Transformations.switchMap(query, search -> {
if (search == null){
return AbsentLiveData.create();
}
// Transformations.switchMap(downloadable, inner -> {
// itemRepository.getDBItems(search, inner.getHyperlink(), inner.getDownloadId());
// });
return itemRepository.getDBItems(search, null, 0);
});
因为我无法在不执行 switchMap 的情况下从 downloadable 中获取数据,而且我无法在不返回的情况下获取 itemRepository.getDBItems,所以我被卡住了。
我的直播结果:
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == DOWNLOAD_ID){
Item i = new Item();
i.setHyperlink(resultData.getString("hyperlink"));
i.setDownloadId(resultData.getLong("downloadId"));
itemViewModel.setDownloadable(i);
}
}
查看了 Google 个示例并制作了一个对象以将其包裹在 ViewModel 中。
我的最终结果:
@Inject
ItemViewModel(@NonNull ItemRepository itemRepository){
this.itemQuery = new MutableLiveData<>();
items = Transformations.switchMap(itemQuery, input -> {
if (input.isEmpty()){
return AbsentLiveData.create();
}
return itemRepository.getDBItems(input.query, input.hyperlink, input.downloadId);
});
@VisibleForTesting
public void setItemQuery(String query, String hyperlink, long downloadId) {
ItemQuery update = new ItemQuery(query,hyperlink,downloadId);
if (Objects.equals(itemQuery.getValue(), update)) {
return;
}
itemQuery.setValue(update);
}
@VisibleForTesting
static class ItemQuery{
public final String query;
public final String hyperlink;
public final long downloadId;
ItemQuery(String query, String hyperlink, long downloadId) {
this.query = query;
this.hyperlink = hyperlink;
this.downloadId = downloadId;
}
boolean isEmpty() {
return query == null;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ItemQuery itemQuery = (ItemQuery) o;
if (query != null ? !query.equals(itemQuery.query) : itemQuery.query != null) {
return false;
}
return hyperlink != null ? hyperlink.equals(itemQuery.hyperlink) : itemQuery.hyperlink == null;
}
}
似乎符合我的预期目的。