ViewModel 中的 LiveData 如何使用 Transformations 观察 Repository 中的 LiveData?

Yad*_*sai 6 android android-asynctask android-livedata android-architecture-components

我在我的存储库中使用了一个 AsyncTask,它用于在存储库中设置 LiveData。如何使用转换从我的 ViewModel 观察这个 LiveData?

SSM*_*SMI 1

所以我今天就尝试了这个东西,但无法让它发挥作用。我都尝试过

Transformations.switchMap(application.getFinanceRepository().getTransaction(id),
            new Function<Transaction, LiveData<Transaction>>() {
                @Override
                public LiveData<Transaction> apply(Transaction input) {
                    Log.d(TAG, "apply: VIewModel Transaction changed: " + input.toString());
                    //Set the inital transaction to track changes
                    initialTransaction = input;

                    //Update the transaction observed by the activity/fragment
                    currentTransaction.setValue(input);
                    return currentTransaction;
                }
            });
Run Code Online (Sandbox Code Playgroud)

Transformations.map(loading,
            new Function<Transaction, Object>() {
                @Override
                public Object apply(Transaction input) {
                    //Set the inital transaction to track changes
                    initialTransaction = new Transaction(input);

                    //Update the transaction observed by the activity/fragment
                    currentTransaction.setValue(input);
                    return null;
                }
            });
Run Code Online (Sandbox Code Playgroud)

其中 currentTransaction 是一个 MutableLiveData,而 initalTransaction 只是一个 Transaction 对象。application.getFinanceRepository().getTransaction(id) 返回 LiveData

这编译得很好,但没有正确运行。apply() 从未被调用,我留下了一个空事务。我不知道如何让它加载一些东西。

作为使其正常工作的解决方法,我将 application.getFinanceRepository().getTransaction(id) 返回到片段/活动。然后,观察者将调用 viewModel 中的方法将 Transaction 返回给视图模型

public void transactionLoaded(Transaction transaction) {
    initialTransaction = new Transaction(transaction);
    currentTransaction.setValue(transaction);
}
Run Code Online (Sandbox Code Playgroud)

然后我还设置活动来观察 currentTransaction 和 MutableLiveData

更多的片段希望能澄清我所做的事情。

Fragment.java onActivityCreated()

    viewModel.loadTransaction(id).observe(this, new Observer<Transaction>() {
        @Override
        public void onChanged(@Nullable Transaction transaction) {
            viewModel.transactionLoaded(transaction);
        }
    });

    viewModel.getTransaction().observe(this, new Observer<Transaction>() {
        @Override
        public void onChanged(@Nullable Transaction trans) {
            //When new LiveData arrives update the transaction and then the views
            Log.d(TAG, "onChanged: transaction changed: " + trans.toString());
            transaction = trans;
            updateViews();
        }
    });
Run Code Online (Sandbox Code Playgroud)

TransactionViewModel.java 相关部分

private Transaction initialTransaction;
private final MutableLiveData<Transaction> currentTransaction = new MutableLiveData<>();

public LiveData<Transaction> loadTransaction(int id) {
    return application.getFinanceRepository().getTransaction(id);
}


public void transactionLoaded(Transaction transaction) {
    initialTransaction = new Transaction(transaction);
    currentTransaction.setValue(transaction);
}
Run Code Online (Sandbox Code Playgroud)

它并不理想,因为除非片段/活动参与,否则它不会起作用,但它确实起作用。