gpt4 book ai didi

android - 为什么我的 Activity 没有看到观察到的物体变化?

转载 作者:行者123 更新时间:2023-12-03 10:56:25 25 4
gpt4 key购买 nike

我是Android开发的新手,我试图了解MVVM架构的实时数据。
我试图使主 Activity 识别属于 Activity View 模型的对象中的更改。

我创建了一个简单的登录 Activity ,该 Activity 将从用户名和密码字段中获取文本,并将其传递给 View 模型的登录功能,然后该功能将数据发送到用户存储库,然后向spring-server发出POST请求在我的电脑上运行。
如果用户名和密码正确,则存储库登录功能将返回具有已登录用户名的MutableLiveData对象,否则返回null。
存储库工作正常(从服务器返回的数据正确)。 View 模型的字段类型为MutableLiveData,在调用登录函数后需要对其进行更新。在 Activity 中,应该有一个观察者,该事件应在loginInUser字段(类型为MutableLiveData)中发生更改时得到通知,即使发生更改,也永远不会激活该观察者的onChange函数。

我希望有一些代码可以帮助我更好地解释。

主要 Activity :

public class MainActivity extends AppCompatActivity {
public EditText usernameTxt;
public EditText passwordTxt;
public Button loginBtn;
public String loggedInuUser;
LoginViewModel loginViewModel;


@Override
protected void onCreate(Bundle savedInstanceState) {



super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usernameTxt = findViewById(R.id.usernameTxt);
passwordTxt = findViewById(R.id.passwordTxt);
loginBtn = findViewById(R.id.loginBtn);

loginViewModel = ViewModelProviders.of(this ).get(LoginViewModel.class);
loginViewModel.init();
try {
loginViewModel.getLoggedInUser().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Toast toast= Toast.makeText(MainActivity.this,"changed" , Toast.LENGTH_LONG );
toast.show();
}
}
);
}catch (Exception e){
System.out.println("==========================================================");
System.out.println( e.getMessage());
System.out.println("==========================================================");
}

}


protected void onLogInCliked(View v ){

// Toast toast= Toast.makeText(getApplicationContext(),loggedInuUser, Toast.LENGTH_LONG );
// toast.show();
loginViewModel.login(usernameTxt.getText().toString(),passwordTxt.getText().toString());
// Toast toast2= Toast.makeText(getApplicationContext(),loggedInuUser, Toast.LENGTH_LONG );
// toast2.show();


}
}

View 模型:
public class LoginViewModel extends ViewModel {


private UsersRepository usersRepository;
private MutableLiveData<String> loggedInUser;

public void init(){
if(loggedInUser!= null){
return;
}

usersRepository = UsersRepository.getInstance();
loggedInUser=new MutableLiveData<>();
}


public MutableLiveData<String> getLoggedInUser(){
return loggedInUser;
}

public void login(String userName , String hashedPassword) {

loggedInUser = usersRepository.login(userName, hashedPassword);
}
}

资料库:
public class UsersRepository {

private static UsersRepository usersRepository;

public static UsersRepository getInstance(){
if (usersRepository == null){
usersRepository = new UsersRepository();
}
return usersRepository;
}

private UsersRepositoryApi usersRepositoryApi;

public UsersRepository(){
usersRepositoryApi = RetrofitService.cteateService(UsersRepositoryApi.class);
}


public MutableLiveData<String> login(String username , String hashedPassword){
final MutableLiveData<String> loggedInUser = new MutableLiveData<>();
User user = new User(username,hashedPassword);

usersRepositoryApi.login(user).enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
loggedInUser.setValue(response.body());
}
}

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

return loggedInUser;
}

}

在mainActivity中,我设置了观察者,并希望该应用程序显示我的Toast消息,但是什么也没有发生。

我试图查看 View 模型中发生了什么,这有点奇怪,
所以我打印了这样的东西:
    public void login(String userName , String hashedPassword) {

System.out.println("222======================================");
System.out.println("==========================================");
System.out.println("==========================================");
System.out.println(loggedInUser.getValue());
System.out.println("==========================================");
System.out.println("==========================================");
System.out.println("==========================================");
loggedInUser = usersRepository.login(userName, hashedPassword);

System.out.println("333======================================");
System.out.println("==========================================");
System.out.println("==========================================");
System.out.println(loggedInUser.getValue());
System.out.println("==========================================");
System.out.println("==========================================");
System.out.println("==========================================");

}

第一次运行登录功能时,222和333的输出均为空,但是第二次运行登录功能时,222的输出为loggingInUser,输出333为null

在这两种情况下,都未观察到观察者的变更功能

有谁知道我在做什么错?

谢谢你
罗宁!

最佳答案

在这里,您的问题是存储库中的存储库代码正在创建可变实时数据的新对象并观察不同的对象。

Interface Callback{
onSuccess(String response)
onError(String error)
}

public void login(String username , String hashedPassword,Callback callback){
final MutableLiveData<String> loggedInUser = new MutableLiveData<>();
User user = new User(username,hashedPassword);

usersRepositoryApi.login(user).enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
callback.onSuccess(response.body());
}
}

@Override
public void onFailure(Call<String> call, Throwable t) {
callback.onError(null);
}
});
}
//login method of your viewmodel 
public void login(String userName , String hashedPassword) {
usersRepository.login(userName, hashedPassword,new Callback(){
void onSuccess(String responsebody){
loggedInUser.setValue(responsebody);
}

void onError(String error){
loggedInUser.setValue(responsebody);
}
});
}

关于android - 为什么我的 Activity 没有看到观察到的物体变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57209552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com