有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么postValue()不能在新线程中工作?

我调用了postValue(),但MutableLivdata不更新其值

当我在setNetworkObj()setUserName()处打印Log in UserInfoViewModel时,参数的值没有错误(参数很好地到达)

但是userName.getValue()打印为空

所以我在Handler和runOnUiThread中尝试了postValue(),但也没有任何效果

如果你能告诉我怎么解决,我将非常感激

这是我的密码

UserInfoViewModel。java

public class UserInfoViewModel extends ViewModel {
    private MutableLiveData<NetworkObj> networkObj = new MutableLiveData<>();
    private MutableLiveData<String> userName = new MutableLiveData<>();

    public MutableLiveData<NetworkObj> getNetworkObj() {
        return networkObj;
    }

    public void setNetworkObj(NetworkObj networkObj) {
        this.networkObj.postValue(networkObj);
    }

    public MutableLiveData<String> getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName.postValue(userName);
    }
}

后勤活动。java

public class LoginActivity extends AppCompatActivity {
    private ActivityLoginBinding binding;

    private UserInfoViewModel userInfoViewModel;

    public Socket socket;
    public ObjectInputStream ois;
    public ObjectOutputStream oos;

    private NetworkUtils networkUtils;
    private NetworkObj networkObj;
    private String userName ="";

    final String ip_addr = "10.0.2.2"; // Emulator PC의 127.0.0.1
    final int port_no = 30000;

    Handler mHandler = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        binding = ActivityLoginBinding.inflate(getLayoutInflater());
        super.onCreate(savedInstanceState);
        setContentView(binding.getRoot());

        userInfoViewModel = new ViewModelProvider(this).get(UserInfoViewModel.class);
        mHandler = new Handler();

        binding.btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                userName = binding.etName.getText().toString();
                new Thread() {
                    public void run() {
                        try {
                            socket = new Socket(ip_addr, port_no);
                            oos = new ObjectOutputStream(socket.getOutputStream());
                            ois = new ObjectInputStream(socket.getInputStream());
                            networkObj = new NetworkObj(socket, ois, oos);
                            networkUtils = new NetworkUtils(networkObj);
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    userInfoViewModel.setNetworkObj(networkObj);
                                    userInfoViewModel.setUserName(userName);
                                }
                            });


                            ChatMsg obj = new ChatMsg(userName, "100", "Hello");
                            networkUtils.sendChatMsg(obj, networkObj);
                            startMainActivity();
                        } catch (IOException e) {
                            Log.w("Login", e);
                        }
                    }
                }.start();
            }
        });
    }

    public void startMainActivity() {
        startActivity(new Intent(this, MainActivity.class));
    }
}

共 (0) 个答案