尝试更新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;
}
回答您的评论
如果我删除了“ .notify()”,那么如何获取MutableLiveData进行更新?
我只知道两种方式。可能对您有帮助。
您可以将回调函数发送到loginUser()
in参数。
您可以使用execute
,而不是enqueue
和同步地发出请求。但是您需要在另一个线程中执行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句