簡體   English   中英

使用 RxJava 改造來自視圖模型的響應以在片段中觀察

[英]Retrofit response from view-model to observe in fragment using RxJava

我有一個使用 API 調用登錄的登錄片段。 我使用 mvvm 和數據綁定將視圖與視圖模型綁定。 在使用 RxJava 的視圖模型中觀察到通過改造的視圖模型登錄響應。

我需要觀察 loginFragment 中的改造響應,當改造響應到來時沒有觀察到。 以下是片段和視圖模型代碼。 我需要改造響應傳遞給片段或片段獲得自動觀察響應。

public class LoginFragment extends Fragment {

    private LoginViewModel mLoginViewModel;
    private Observable<LoginResult> dataObservable;
    public static String TAG = LoginFragment.class.getSimpleName();
    public Disposable disposable;
    public static Fragment LoginFragmentInstance() {
        Log.e(TAG, "LoginFragmentInstance: " );
        Fragment fragment = new LoginFragment();
        return fragment;
    }

    public LoginFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        FragmentLoginBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false);
        mLoginViewModel = new LoginViewModel(getActivity());
        //setViewModel method name changes based on variable name declared in XML

        //mLoginViewModel.loginResult.observeO
        dataObservable= mLoginViewModel.loginResult;

        disposable = dataObservable.subscribe(new Consumer<LoginResult>() {
            @Override
            public void accept(LoginResult result) throws Exception {
                Log.d("TAG", result.toString());
            }
        });

        binding.setViewModel(mLoginViewModel);
        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        mLoginViewModel.destroy();
        disposable.dispose();
        super.onDestroy();
    }

}

視圖模型文件

public class LoginViewModel {
    private static final String TAG = "LoginViewModel";
    public ObservableField<String> userName  = new ObservableField<>();
    public ObservableField<String> password  = new ObservableField<>();
    public ObservableField<String> email  = new ObservableField<>();
    public ObservableField<String> userNameErr  = new ObservableField<>();
    public ObservableField<String> passwordErr  = new ObservableField<>();
    public ObservableField<String> emailErr  = new ObservableField<>();
    public Observable<LoginResult> loginResult = new Observable<LoginResult>() {
        @Override
        protected void subscribeActual(Observer<? super LoginResult> observer) {

        }
    };
    public ObservableField<Boolean> enableLogin;
    private CompositeDisposable myCompositeDisposable = new CompositeDisposable();
    private HashMap<String, String> loginApiParams;

    public Action signIn;
    public Context context;

    public LoginViewModel(final Context context) {

        this.context = context;
        Observable result =  Observable.combineLatest(FieldUtils.toObservable(userName), FieldUtils.toObservable(password),
                new BiFunction() {
                    @Override
                    public Object apply(Object userName, Object password) throws Exception {
                        int failCount = 0;
                        if (!InputValidator.validateMobileno(userName.toString())) {
                            ++failCount;
                            userNameErr.set(context.getResources().getString(R.string.mobileno_incorrect));
                        } else {
                            userNameErr.set("");
                        }
                        if (!InputValidator.validatePassword(password.toString())) {
                            ++failCount;
                            passwordErr.set(context.getResources().getString(R.string.password_incorrect));
                        } else {
                            passwordErr.set("");
                        }
                        return failCount == 0;
                    }
                });
        enableLogin = FieldUtils.toField(result);
        signIn = new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "signIn button clicked");
                loginCall();
            }
        };
     }

    private void loginCall()  {

        loginApiParams =  new HashMap<>();
       // loginApiParams.put(, paymentType.toString())
        loginApiParams.put(ApiParameterKeyConstants.MOBILE,userName.get());
        loginApiParams.put(ApiParameterKeyConstants.PASSWORD, password.get());
        UserApi usersService = ApiService.INSTANCE.apiCall();

        Disposable disposable = usersService.getLogin(loginApiParams)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<LoginResult>() {
                    @Override
                    public void accept(LoginResult result) throws Exception {
                        loginResult = Observable.just(result);
                        //loginResult.subscribe()
                        //loginResult = result  ;
                        //Log.d(TAG, "Login Successfull");
                    }
                    }, new Consumer<Throwable>()
                    {
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            Log.d(TAG, "Login Failed");
                        }
                    });
        myCompositeDisposable.add(disposable);
    }
}

似乎您在ViewModel loginCall方法中為loginResult重新分配了一個 Observable,而不是將結果傳遞給它的觀察者。

您應該嘗試調用loginResult.onNext(result)loginResult.onComplete(result)而不是loginResult = Observable.just(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM