- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我检查了这两个问题 this和 this ,他们都没有解决我的问题。
其次,我将详细解释所有内容,所以请原谅我的长篇文章。
所以我第一次尝试在 android 中实现 MVVM,并遵循 tuto1 中的一些指南和步骤。和 tuto2 ,正如我的问题中所明确的,观察者中的 onchanged 方法没有触发,我不明白为什么。这是我的代码架构:
身份验证.java:
@FormUrlEncoded
@POST("service/api/login/")
Call<LoginResponse> login(@Field("username") String username,
@Field("password") String password);
为了处理错误,我按照 tuto1 实现了一个通用请求处理程序:
GenericRequestHandler.java:
public abstract class GenericRequestHandler<T extends Response> {
private static final String TAG = GenericRequestHandler.class.getName();
abstract protected Call<T> makeRequest();
public final MutableLiveData<DataWrapper<T>> doRequest() {
final MutableLiveData<DataWrapper<T>> liveData = new MutableLiveData<>();
final DataWrapper<T> dataWrapper = new DataWrapper<>();
makeRequest().enqueue(new ApiCallback<T>() {
@Override
protected void handleResponseData(T data) {
Log.e(TAG, "handleResponseData: being handled");
dataWrapper.setData(data);
liveData.postValue(dataWrapper);
}
@Override
protected void handleError(String message) {
Log.e(TAG, "handleError: error handled");
dataWrapper.setErrorMessage(message);
liveData.postValue(dataWrapper);
}
@Override
protected void handleException(Exception t) {
Log.e(TAG, "handleException: exception handled");
dataWrapper.setApiException(t);
liveData.postValue(dataWrapper);
}
@Override
protected void handleHttpCodes(int code) {
Log.e(TAG, "handleHttpCodes: code handled");
dataWrapper.setCode(code);
liveData.postValue(dataWrapper);
}
});
return liveData;
}
}
然后我从中制定了一个规范,以处理登录:
SignInRequestHandler.java:
public class SignInRequestHandler extends GenericRequestHandler {
private Authentication service = RestClient.getInstance().create(Authentication.class);
private String username, password;
public SignInRequestHandler(String username, String password) {
this.username = username;
this.password = password;
}
@Override
protected Call<LoginResponse> makeRequest() {
return service.login(username, password);
}
public MutableLiveData<DataWrapper<LoginResponse>> onAuthRequest() {
return doRequest();
}
}
出于验证目的,我在模型中调用登录请求处理程序,如下所示:
public MutableLiveData<DataWrapper<LoginResponse>> login() {
SignInRequestHandler handler = new SignInRequestHandler(this.userName, this.pass);
return handler.onAuthRequest();
}
这是 View 模型:
LoginVModel.java:
public class LoginVModel extends ViewModel {
private static final String TAG = LoginVModel.class.getName();
private Driver driver; //this is my model
public MutableLiveData<String> username;
public MutableLiveData<String> password;
public MutableLiveData<DataWrapper<LoginResponse>> loginLiveData;
public LoginVModel() {
driver = new Driver();
username = new MutableLiveData<>();
loginLiveData = new MutableLiveData<>();
password = new MutableLiveData<>();
}
public void onLogin(View view) {
Log.e(TAG, "onLogin: " + username.getValue() + " " + password.getValue() );
driver.setUserName(username.getValue());
driver.setPass(password.getValue());
loginLiveData = driver.login();
}
}
为了更好的错误处理,我实现了 tuto1 的 api 观察器:
ApiObserver.java:
public class ApiObserver<T> implements Observer<DataWrapper<T>> {
private ChangeListener<T> changeListener;
public ApiObserver(ChangeListener<T> changeListener) {
this.changeListener = changeListener;
}
@Override
public void onChanged(@Nullable DataWrapper<T> tDataWrapper) {
if (tDataWrapper != null)
if (tDataWrapper.getApiException() != null)
changeListener.onFail(tDataWrapper.getApiException());
else if (tDataWrapper.getCode() != 0)
changeListener.handleCodes(tDataWrapper.getCode());
else if (!tDataWrapper.getErrorMessage().equals(""))
changeListener.onErrorMessage(tDataWrapper.getErrorMessage());
else
changeListener.onSuccess(tDataWrapper.getData());
}
public interface ChangeListener<T> {
void onSuccess(T dataWrapper);
void onFail(Exception exception);
void handleCodes(int code);
void onErrorMessage(String message);
}
}
在 Activity 中,我对电子邮件和密码使用双向绑定(bind),并且登录按钮从 viewModel 触发 onLogin:
SignInActivity.java:
public class SignInActivity extends AppCompatActivity {
private static final String TAG = SignInActivity.class.getName();
private ActivitySignInBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_sign_in);
Utilities.setHtmlText(R.string.forget_password, binding.forgetPassword);
LoginVModel login = ViewModelProviders.of(this).get(LoginVModel.class);
binding.setLoginModel(login);
binding.setLifecycleOwner(this);
login.loginLiveData.observe(this, new ApiObserver<>(listener));
}
private ApiObserver.ChangeListener<LoginResponse> listener = new ApiObserver.ChangeListener<LoginResponse>() {
@Override
public void onSuccess(LoginResponse dataWrapper) {
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
}
@Override
public void onFail(Exception exception) {
exception.printStackTrace();
CheckInternetConnection.requestFail();
}
@Override
public void handleCodes(int code) {
// TODO: 10/2/2019 implement code handling here
Log.e(TAG, "handleCodes: " + code);
}
@Override
public void onErrorMessage(String message) {
Log.e(TAG, "onErrorMessage: i'm here");
ToastMaker.getInstance().showErrorToast(message);
}
};
}
所以我尝试使用错误的数据登录,因此会触发错误消息,这是控制台日志:
E/driver.itgds.khadametdz.viewmodel.viewmodel.LoginVModel: onLogin: test test
E/driver.itgds.khadametdz.api.requesthandler.GenericRequestHandler: handleError: error handled
所以 toast 没有显示,上面的日志也没有显示,所以请问我做错了什么?
PS:对于通用处理程序中的实时数据,我尝试了 .setValue() 和 .PostValue(),但没有一个得到所需的结果。
编辑:我用这种方法尝试了 View 模型,但它没有改变任何东西。
public void onLogin(View view) {
Log.e(TAG, "onLogin: " + username.getValue() + " " + password.getValue() );
driver.setUserName(username.getValue());
driver.setPass(password.getValue());
// loginLiveData = driver.login();
loginLiveData.postValue(driver.login().getValue());
}
最佳答案
当你创建 ViewModel 时,你会像这样创建 LiveData
loginLiveData = new MutableLiveData<>();
因此,当您执行此操作时,在 Activity 中
login.loginLiveData.observe(this, new ApiObserver<>(listener));
你听这个新的 MutableLiveData<>();。但是当你用这个替换 LiveData 的引用后
loginLiveData = driver.login();
所以你没有观察到相同的 MutableLiveData。我想问题就出在这里。
关于java - 观察通过改造更改的实时数据不会在更改时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58218986/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!