Работа с внутренним Transformations.switchMap в viewModel - PullRequest
0 голосов
/ 02 февраля 2020

Я загружаю данные из API в адаптер, когда пользователь щелкает по нему, он загружается с помощью DownloadManager, а затем я использую вещатель, чтобы сообщить моей активности идентификатор загрузки и гиперссылка (уникальный идентификатор для комнаты).

До сих пор я не мог понять, как лучше всего использовать тот же наблюдатель, что и вначале, это просто получение данных (у которых нет downloadId), а затем прохождение через идентификатор downloadId и гиперссылку на хранилище. До сих пор я мог делать это успешно из репозитория в виде жестко закодированных данных.

Моя ViewModel:

    @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, и Я не могу получить 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);
    }
}

1 Ответ

0 голосов
/ 07 февраля 2020

Просмотрите образцы 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;
    }
}

Кажется, работает для моих предполагаемых целей.

...