更新mutablelivedata时引发异常

l3zydbqr  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(407)

我在尝试更新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;
    }

我的用户界面

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;
    }
ej83mcc0

ej83mcc01#

回答你的意见
如果删除“.notify()”,那么如何获取要更新的mutablelivedata?
我只知道两种方法。也许对你有帮助。
您可以将回调函数发送到 loginUser() 在争论中。
你可以用 execute 相反 enqueue 与请求同步工作。但你需要在另一个线程中执行此操作。

相关问题