나는 안드로이드 mvvm 구조를 배우고 있으며 그것을 구현하는 동안 의심이 있습니다. room을 사용하여 데이터베이스에 사용자 개체를 삽입했습니다. 그러나 삽입이 성공적으로 완료된 후 활동을 알리는 방법을 모르겠습니다.
나는 그것을 구현하려고 노력했다. 그러나 작동하지 않았습니다. 내 코드를 보여 드리겠습니다.
RegisterActivity
public class RegisterActivity extends AppCompatActivity {
ActivityRegisterBinding activityRegisterBinding;
RegisterViewModel registerViewModel;
private final CompositeDisposable mDisposable = new CompositeDisposable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDataBinding();
onUserRegistered();
}
private void initDataBinding() {
activityRegisterBinding = DataBindingUtil.setContentView(this, R.layout.activity_register);
RegisterViewModelFactory registerViewModelFactory = Injection.provideRegisterViewModelFactory(this);
registerViewModel = ViewModelProviders.of(this,registerViewModelFactory).get(RegisterViewModel.class);
activityRegisterBinding.setRegisterViewModel(registerViewModel);
}
private void onUserRegistered() {
findViewById(R.id.register_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDisposable.add(registerViewModel.onClickedSignUp()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action() {
@Override
public void run() throws Exception {
Log.e("Success!!!","added a record");
Toast.makeText(RegisterActivity.this,"success",
Toast.LENGTH_SHORT).show();
onBackPressed();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("Unable to add a record", throwable.toString());
throwable.printStackTrace();
}
}));
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mDisposable.dispose();
}
}
RegisterViewModel
public class RegisterViewModel extends ViewModel {
public ObservableField<String> name;
public ObservableField<String> password;
private UserDataSource userDataSource;
RegisterViewModel(UserDataSource userDataSource){
name=new ObservableField<>("");
password=new ObservableField<>("");
this.userDataSource=userDataSource;
}
public TextWatcher nameWatcher=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(!name.get().equals(s.toString())){
name.set(s.toString());
}
}
};
public TextWatcher passwordWatcher=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(!password.get().equals(s.toString())){
password.set(s.toString());
}
}
};
public Completable onClickedSignUp() {
isLoading.setValue(true);
if (name != null)
Log.e("name", name.get());
if (password != null)
Log.e("pass", String.valueOf(password.get()));
return Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
Log.e("final name",name.get());
User user=new User(0,name.get(),0,0);
userDataSource.insertOrUpdateUser(user);
}
});
}
}
뷰 모델에서 출력 된 로그에서 이름과 비밀번호의 적절한 값을 얻고 있지만 버튼 클릭 이벤트에 레코드가 추가되지 않고 성공 또는 실패에 대한 활동을 알리지 않습니다. 이 경우 어떻게해야합니까?
mvvm을 처음 접하고 배우기 때문에 나를 안내하십시오.
데이터 액세스 개체 인터페이스에서 삽입 메서드의 반환은 무효입니다. 데이터가 삽입 될 때 콜백을받지 않습니다. insert 메소드를 호출 한 직후 수행 할 작업을 수행 할 수 있습니다.
또한 onDestroy
활동 방법 에서 mDisposable에 추가 한 일회용품을 폐기하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다