我正处于新Android项目的最开始阶段.在我上一个项目中使用MVP之后,我想这次使用Data Binding实现MVVM.
当涉及到屏幕方向更改等配置更改时,我无法正确理解DataBinding.
那里的所有DataBinding示例(我在寻找"android mvvm数据绑定"时找到的所有)都有同样的问题:当我在EditText中输入内容并旋转屏幕时,EditText之后是空的.
一旦我的布局中出现类似下面的内容,我就无法获得视图(本例中为EditText)以在屏幕旋转更改后恢复其状态.
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.example.app.TestViewModel" />
</data>
<EditText android:id="@+id/question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={vm.question}"
android:hint="Question" />
</layout>
Run Code Online (Sandbox Code Playgroud)
我想这是因为每次都在活动onCreate方法中分配一个新的视图模型实例.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityTestBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_test);
binding.setVm(new TestViewModel());
}
Run Code Online (Sandbox Code Playgroud)
你是如何正确处理的?
我无法开发具有多种形式的应用程序,这些形式会在屏幕方向上忘记所有用户输入
在我的 Android 应用程序中,我使用 Retrofit 2.2 和 RxJava 2 进行网络调用。当设备连接到网络时一切正常。当我禁用移动和 WiFi 网络时,应用程序崩溃。奇怪的是,我可以正确处理错误,但应用程序还是崩溃了。
这是Retrofit的API接口:
public interface BackendApi {
@GET("v1/users/{uuid}")
Observable<User> getUser(@Path("uuid") String userUuid);
}
Run Code Online (Sandbox Code Playgroud)
以下方法返回一个将在我的视图模型中订阅的 Observable。
@Override
public Observable<User> getUser(@NonNull final UUID id) {
return api.getUser(id.toString()).map(user -> mapUser(user));
}
Run Code Online (Sandbox Code Playgroud)
在视图模型中,我订阅了 Observable:
compositeDisposable.add(userService.getUser(userId)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onGetUser, this::onGetUserError));
Run Code Online (Sandbox Code Playgroud)
下面几行显示了错误处理方法
private void onGetUserError(final Throwable throwable) {
log.error("onGetUserError, getting user failed because of {}",
throwable.getCause());
if (isViewAttached()) {
getView().showUserLoginOrRegisterError();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我断开设备与移动和 WiFi 连接的连接时, onGetUserError() 方法会被正确调用,但无论如何,存在未处理的异常导致我的应用程序崩溃。
这是完整的堆栈跟踪:
https://gist.github.com/anonymous/859ab3811a3ca5c63998a40b877c41bb
我不知道如何摆脱这些崩溃!
问候马丁
----------更新 03.04.2017--------- 还有另一个谜团...在 Samsung Galaxy (S5) …