Невозможно наблюдать Livedata от ViewModel - PullRequest
1 голос
/ 21 ноября 2019

Я ввел простую регистрацию по мобильному номеру в шаблоне проектирования MVVM. Но функция Onloaded не вызывается при возврате ответа с сервера.

LoginViewModel

public class LoginViewModel extends ViewModel {

private LoginModel login;
private MutableLiveData<LoginResponse> loginresponse = new MutableLiveData<>();
private LoginRepository loginrepository;


public void init() {
    login = new LoginModel();
}


public LoginModel getLogin() {
    return login;
}


public void onLoginClick() {
   if(login.isPhonevalid()){
       HashMap<String,Object> loginObject = new HashMap<>();
       loginObject.put("phonenumber",login.getMobileNumber());
       loginObject.put("apimethod","beatme");
       loginresponse = LoginRepository.getInstance().login(loginObject);
      // loginClick.setValue(login);
      }
}


@BindingAdapter("error")
public static void setError(EditText editText, String errormessage) {
    editText.setError(errormessage);

}


public MutableLiveData<LoginResponse> getLoginresponse() {
    return loginresponse;
}


public String getMobileNo(){
    return login.getMobileNumber();
}
}

LoginRepository

public class LoginRepository {


private static LoginRepository loginRepository;
private Api api;

public static LoginRepository getInstance() {
    if (loginRepository == null) {
        loginRepository = new LoginRepository();
    }
    return loginRepository;
}


public LoginRepository() {
    api = RetrofitService.createService(Api.class);
}


public MutableLiveData<LoginResponse> login(HashMap<String, Object> body) {

    final MutableLiveData<LoginResponse> loginResponse = new MutableLiveData<>();
    api.login(body).enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            if (response.isSuccessful()) {
                loginResponse.setValue(response.body());
            }
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            loginResponse.setValue(null);
        }
    });

    return loginResponse;
}

}

LoginActivity

public class LoginActivity extends AppCompatActivity {

private LoginViewModel viewModel;
ActivityLoginBinding activityLoginBinding;




boolean doubleBackToExitPressedOnce = false;


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

    setContentView(R.layout.activity_login);
    getSupportActionBar().hide();
    activityLoginBinding  = DataBindingUtil.setContentView(LoginActivity.this, R.layout.activity_login);

    viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
    if (savedInstanceState == null) {
        viewModel.init();
    }
    activityLoginBinding.setLoginViewModel(viewModel);
    setuploginclick();

}

public void setuploginclick() {
    viewModel.getLoginresponse().observe(this, new Observer<LoginResponse>() {
        @Override
        public void onChanged(LoginResponse loginResponse) {

            Toast.makeText(LoginActivity.this,viewModel.getMobileNo(),Toast.LENGTH_SHORT).show();
            Intent i = new Intent(LoginActivity.this, OTPVerify.class);
            i.putExtra("mobileno",viewModel.getMobileNo());
            startActivity(i);
        }
    });

}
}

Из журнала видно, что данные опубликованы успешно иОтвет тоже идеален. Но присваивание значения «логин-ответу» для liveata не вызывает наблюдаемого.

...