1

如何在后台线程中为 ViewModel 使用 Saved State 模块

因为MutableLiveData我们可以选择使用setvalueand postvalue,其中Postvalue可以在后台线程中使用。

我们如何BACKGROUND THREAD为 ViewModel 使用 FOR Saved State 模块

这是我正在尝试的代码

public class CommonViewModel extends ViewModel {
    private SavedStateHandle mState;

    public CommonViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }

    private static final String NAME_KEY = "name";
    private Executor mExecutor = Executors.newSingleThreadExecutor();

    public LiveData<ArrayList<CommonOwn>> getCart() {
        if (mState.getLiveData(NAME_KEY) == null) {
            initCart();
        }
        return mState.getLiveData(NAME_KEY);
    }

    public void initCart() {
        mState.set(NAME_KEY, new ArrayList<CommonOwn>());
    }

  public void addItemToCart(CommonOwn commonOwn) {
        if (getCart().getValue() == null) {
            initCart();
        }
        ArrayList<CommonOwn> cartItemList = new ArrayList<CommonOwn>(getCart().getValue());
        if (cartItemList.contains(commonOwn)) {
            int a = cartItemList.indexOf(commonOwn);
            cartItemList.remove(a);
        } else {
            cartItemList.add(commonOwn);
        }
       // mState.set(NAME_KEY, cartItemList);
        mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mState.set(NAME_KEY, cartItemList);

            }
        });
    }
}

使用后台线程时出现以下错误

java.lang.IllegalStateException: Cannot invoke setValue on a background thread
        at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:487)
        at androidx.lifecycle.LiveData.setValue(LiveData.java:306)
        at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
        at androidx.lifecycle.SavedStateHandle$SavingStateLiveData.setValue(SavedStateHandle.java:367)
        at androidx.lifecycle.SavedStateHandle.set(SavedStateHandle.java:256)
        at com.example.CommonViewModel$1.run(CommonViewModel.java:63)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

我们如何解决这个问题。

4

1 回答 1

0

以下行永远不能为null

mState.getLiveData(NAME_KEY) == null

希望这说明了解决方案。您只需依赖来自SavedStateHandle的MutableLiveData

public class CommonViewModel extends ViewModel {
    private MutableLiveData<ArrayList<CommonOwn>> cart;

    public CommonViewModel(SavedStateHandle savedStateHandle) {
        cart = savedStateHandle.getLiveData(NAME_KEY);
    }

    private static final String NAME_KEY = "name";
    private Executor mExecutor = Executors.newSingleThreadExecutor();

    public MutableLiveData<ArrayList<CommonOwn>> getCart() {
        return cart;
    }

    public void addItemToCart(CommonOwn commonOwn) {
        ArrayList<CommonOwn> cartItemList;
        if(cart.getValue() == null) {
            cartItemList = new ArrayList<CommonOwn>();
        } else {
            cartItemList = cart.getValue();
        }
        if (cartItemList.contains(commonOwn)) {
            int a = cartItemList.indexOf(commonOwn);
            cartItemList.remove(a);
        } else {
            cartItemList.add(commonOwn);
        }
        // mState.set(NAME_KEY, cartItemList);
        mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                cart.postValue(cartItemList);
            }
        });
    }
}
于 2022-01-08T10:57:43.167 回答