Yad*_*sai 6 android android-asynctask android-livedata android-architecture-components
我在我的存储库中使用了一个 AsyncTask,它用于在存储库中设置 LiveData。如何使用转换从我的 ViewModel 观察这个 LiveData?
所以我今天就尝试了这个东西,但无法让它发挥作用。我都尝试过
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
更多的片段希望能澄清我所做的事情。
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)
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)
它并不理想,因为除非片段/活动参与,否则它不会起作用,但它确实起作用。
| 归档时间: |
|
| 查看次数: |
4572 次 |
| 最近记录: |