更新MutableLiveData时观察到的抛出异常

保罗

尝试更新MutableLiveData时遇到问题。我正在从ViewModel调用登录功能以更新我的UI。在ViewModel中,我对API服务器进行了调用,但是当我调用.notify()时,发生了崩溃:

java.lang.IllegalMonitorStateException:对象在notify()之前没有被线程锁定

我应该在哪里放置它以便工作

这是我的XML文件

    <data>
        <variable
            name="viewModel"
            type="com.kidzmedia.radio.activities.login.LoginViewModel" />
    </data>

....

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="96dp"
        android:onClick="@{() -> viewModel.doLogin()}"
        android:text="Login" />

我的ViewModel

public class LoginViewModel extends ViewModel {
    private MutableLiveData<User> userMutableLiveData;

....

    public void doLogin() {
        userMutableLiveData = userApi.loginUser(email, password);
        Log.i("LOGIN", "do Login");

        //userMutableLiveData.setValue(tmpUser.getValue());
    }

    LiveData<User> getUser() {
        if (userMutableLiveData == null) {
            userMutableLiveData = new MutableLiveData<>();
        }

        return userMutableLiveData;
    }

我的UI

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityLoginBinding activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
        //activityLoginBinding.setViewModel(ViewModelProviders.of(this).get(LoginViewModel.class);

        LoginViewModel loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        activityLoginBinding.setViewModel(loginViewModel);

        loginViewModel.getUser().observe(this, new Observer<User>() {

            @Override
            public void onChanged(User user) {
                if (user != null)
                    // DO STUFF
            }
        });
    }
}

我的Api服务器:

public class UserApi {

    private final String TAG = getClass().getSimpleName();

    public MutableLiveData<User> loginUser(String email, String password) {


        User loginUser = new User(email, password);

        final MutableLiveData<User> mutableLiveData = new MutableLiveData<>();

        UserService userApi = APIUtils.getUserService();
        userApi.doLoginUser(loginUser).enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                mutableLiveData.setValue(response.body());

                // THIS IS WHERE IT CRASHES
                mutableLiveData.notify();
            }
        });

        return mutableLiveData;
    }
谢尔盖·梅尔尼克(Sergey Melnik)

回答您的评论

如果我删除了“ .notify()”,那么如何获取MutableLiveData进行更新?

我只知道两种方式。可能对您有帮助。

  1. 您可以将回调函数发送到loginUser()in参数。

  2. 您可以使用execute,而不是enqueue和同步地发出请求。但是您需要在另一个线程中执行此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RxJava2观察到取抛出UndeliverableException

绑定为可观察到的敲除时如何更新ckeditor数据?

在更改为包含数组时更新Aurelia观察到的属性

C#异步/等待未观察到的异常

如何手动抛出可观察到的错误?

当观察到更改时,React Mobx componentDidUpdate不更新

当观察到的节点被破坏时,MutationObserver是否被破坏?

为什么在使用异步等待时尽管观察到仍抛出UnobservedTaskException?

当使用SyncAdapter /其他线程更新时,LiveData不会观察到更改

在python中遍历列表时观察到奇怪的行为

可观察到的更新时,所选选项不会更新,尽管optionsValue确实会更新

每次观察到订阅时如何运行函数

任一可观察到的更新时触发代码

如果某些可观察到的异常抛出,该如何继续播放?

当数组开始为空时,可观察到的数组mobx不会更新

如何观察到的具有mutablelivedata支持属性的实时数据在从未直接更新时如何触发观察者?

为什么我的组件无法观察到更新?

更新可观察到的“ roles [0]未定义”时出错

KnockoutJs更新视图模型可从Json Webservice观察到

可观察到淘汰赛更新

使用GDB时观察到的问题

Git没有在.gitignore中观察到新的异常

EIdOSSLConnectError与SSL连接时发生错误-观察到EOF

可观察到的数据集未在模板中更新

在 MySQL 更新查询中观察到突然下降

按 SQL 分组时处理未观察到的类别

当观察到的对象更改时,Swift View 不会更新

在 MutableLiveData 列表中未观察到更改

SwiftUI 观察到的对象未更新