android - 使用实时数据更新字符串值

标签 android data-binding android-architecture-components android-livedata android-jetpack

我正在使用实时数据架构实现数据绑定(bind)。我做了所有的事情,但我无法找到我必须在哪里更新 fragment 中的响应值。 我制作了一个按钮并单击按钮我能够将数据发送到服务器并获得响应。但我的问题是如何在 fragment 中更新 msg 值或 Success 值。当值更新时,我的观察者没有被调用。有什么我做错了实现吗?提前致谢。

我的 fragment

  **Oncreate Method**
            {        signUpViewModel=ViewModelProviders.of(getActivity()).get(SignUpViewModel.class);
                observeViewModel(signUpViewModel);
              return view;
            }

//my observe class
            private void observeViewModel(SignUpViewModel signinViewModel) {
                    if (signinViewModel.getmessage() != null) {
                        signinViewModel.getmessage().observe(this, new Observer<String>() {
                            @Override
                            public void onChanged(@Nullable String msg) {
                                if (msg != null) {
                                    Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                    }
                }

//button clicked     
            public void onSignUpClicked(View view)
            {   
     signUpViewModel.registerUser(userFName, userLName, userEmail,userPassword);
                    }

SignUpViewModel.class

public class SignUpViewModel extends ViewModel{
    private LoginFragmentRepository loginFragmentRepository;
    private LiveData<String> sucessMsg;
    String signUpMsg;

    public  void registerUser(String userFName, String userLName, String userEmail, String userPassword) {
       loginFragmentRepository=new LoginFragmentRepository();
        sucessMsg= loginFragmentRepository.registerUser( userFName,  userLName,  userEmail,  userPassword);
    }

    /**
     * get signup msg
     * @return
     */
    public LiveData<String> getmessage() {
        return sucessMsg;
    }

登录 fragment 库

{
    private ApiInterface apiInterface;
    private UserDao userDao;
public LiveData<String> registerUser(String userFName, String userLName, String userEmail, String userPassword) {
        apiInterface = RestApi.getRetroInstance().create(ApiInterface.class);
         final MutableLiveData<String> msg = new MutableLiveData<>();
        Call<SignUpModel> req = apiInterface.registerUser(userFName,userLName,userEmail,userPassword);
        req.enqueue(new Callback<SignUpModel>() {
            @Override
            public void onResponse(Call<SignUpModel> call, Response<SignUpModel> response) {
                if (response.isSuccessful()) {
                  //update this value in fragment
                    msg.postValue(response.body().getData());
                    //getReceipesListDataResponseMutableLiveData.setValue(NetworkResponse.success(receipes));
                } else {
                    msg.postValue("Please check your network connection");
                }
            }

            @Override
            public void onFailure(Call<SignUpModel> call, Throwable t) {
                msg.postValue("Please check your network connection");
            }
        });
        return msg;
    }
}

最佳答案

您的 onCreateView 方法被调用一次,以下条件为真并且您永远不会注册一个可观察对象:

if (signinViewModel.getmessage() != null) {
                        signinViewModel.getmessage().observe(this, new Observer<String>() {
                            @Override
                            public void onChanged(@Nullable String msg) {
                                if (msg != null) {
                                    Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                    }

我建议你做的是这个。将 View 模型中的 registerUser 方法更改为:

 public  LiveData<String> registerUser(String userFName, String userLName, String userEmail, String userPassword) {
       loginFragmentRepository=new LoginFragmentRepository();
       return loginFragmentRepository.registerUser( userFName,  userLName,  userEmail,  userPassword);
    }

然后在您的 fragment 中,观察您何时单击按钮。

public void onSignUpClicked(View view)
            {   
     signUpViewModel.registerUser(userFName, userLName, userEmail,userPassword).observe(this, new Observer<String>() {
                            @Override
                            public void onChanged(@Nullable String msg) {
                                if (msg != null) {
                                    Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                    }

关于android - 使用实时数据更新字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50680391/

相关文章:

java - 如何使用 javafx.beans.binding.Bindings.select(...) 进行简洁的值绑定(bind)

javascript - 如何将此元素作为 anchor 标记传递给 JavaScript 函数

c# - 在从 Enum 填充的 ListPicker 中使用本地化字符串

android - 在导航图的第一个屏幕上的工具栏上显示后退按钮

android - 如何将 POST 请求从 Android 发送到我的应用程序服务器?

java - wait() 不强制线程等待?

android - 显示和隐藏软键盘不起作用

android - 如果我的应用程序是默认应用程序,我该如何开始下一个匹配 Activity

java - LiveData、Transformations.map() - 如何在用户更改过滤顺序时强制刷新?

安卓房间数据库 : How to query alphabetically by name?