我对接口的功能有疑问。 我的两个班级都使用AndroidViewModel,它提供Application作为构造函数的参数。
我的问题是,当活动A开始活动B时,为什么类A的onUpdate仍然被调用为finish()方法。请帮助我理解这部分。
这会导致我的应用崩溃并出现以下错误
Unable to add window -- token android.os.BinderProxy@236c862 is not valid; is your activity running?
A.java
class A extends AppCompatActivity implements C.listenerX{
Context context;
LoginViewModel loginViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
context = this;
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
}
@Override
public void onUpdate(
....
startActivty(new Intent(this, B.class));
finish();
}
}
class B extends AppCompatActivity implements C.listenerX{
Context context;
LoginViewModel loginViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
context = this;
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
}
@Override
public void onUpdate(
....
startActivty(new Intent(this,
}
}
class C {
public interfaces listenerX{
void onUpdate();
}
...
}
答案 0 :(得分:0)
为什么在“活动”中保留指向该活动的引用?
Context context;
context = this;
您为什么以这种方式使用ViewModel?它将超过您的活动。正如Pawel所说,您必须了解生命周期。因此,只需删除这些接口。
ViewModel是MVVM模式的一部分。在模式中,ViewModel不了解任何视图。它公开了视图正在观察的流。您需要拥有ViewModel:
private val _onUpdate = MutableLiveData<Event<Boolean>()
val onUpdate : LiveData<Boolean>
get() = _onUpdate
然后您可以像这样在“视图”中观察它:
viewModel.onUpdate.observe(this, EventObserver {// Do what you need})
您可以参考这篇文章,事件如何与LiveData一起使用:
关于您的活动如何运作的问题。首先让我们弄清楚LiveData是如何工作的。您在其中设置了相同的数据,例如字符串。
//In the model
LiveData name = new MutableLiveData<String>
//In the view
// Create the observer which updates the UI.
final Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newName) {
// Update the UI, in this case, a TextView.
nameTextView.setText(newName);
}
};
现在,一旦设置了名称,就不会在每次设备旋转时都出现该名称,并且TextView将被更新。在您开始观察的那一刻,您不仅观察了将来的数据,而且还接收了最后一个数据。
所以在另一种情况下。您尝试访问服务器。但是服务器回复用户未通过身份验证。您要询问用户进行身份验证。您可以使用LiveData完成。观察并在触发时显示对话框。这里的问题是,如果用户旋转屏幕,您将再次观察相同的数据并再次显示对话框。您不想这样做,因此需要一个事件。工作原理:您具有标志“ hasBeenHandled”,并且如果某个观察者一次接收到数据,则该标志设置为true,并且任何后续的观察者都将收到null。还有一种方法:peekContent,因此您可以强制读取数据。 EventObserver是处理样板代码的类。
如果您正在使用LiveData,它将知道活动处于正确状态的时间,并且在活动终止时将永远不会收到通知。
您还知道这两个活动都引用了ViewModel的不同实例吗?如果要共享某些内容,则需要在同一活动中包含片段。
您几乎不应使用AndroidViewModel !!!