gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:31:26 27 4
gpt4 key购买 nike

我在尝试更新我的 MutableLiveData 时遇到问题。我正在从我的 ViewModel 调用登录函数来更新我的 UI。在我的 ViewModel 中,我调用了我的 API 服务器,但是当我调用 .notify() 时,我遇到了崩溃:

java.lang.IllegalMonitorStateException: object not locked by thread before 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" />
我的 View 模型
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;
}
我的用户界面
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;
}

最佳答案

回答您的评论

if I remove the ".notify()", then how can I get the MutableLiveData to update?


我只知道两种方法。可能对你有帮助。
  • 您可以发送回调函数到loginUser()在争论中。
  • 您可以使用 execute而是 enqueue并同步处理请求。但是您需要在另一个线程中执行此操作。
  • 关于java - 更新 MutableLiveData 时可观察到的抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64842032/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com