gpt4 book ai didi

java - Activity结束后如何结束接口(interface)回调

转载 作者:行者123 更新时间:2023-12-01 23:52:04 24 4
gpt4 key购买 nike

我对接口(interface)的功能有疑问。我的两个类都使用 AndroidViewModel,它提供 Application 作为构造函数的参数。

我的问题是,当 Activity A启动 Activity 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();
}
...
}

最佳答案

为什么要在 Activity 中保留指向该 Activity 的引用?

 Context context;
context = this;

为什么要以这种方式使用 ViewModel?它会比你的 Activity 更长久。正如 Pawel 所说,你必须了解生命周期。所以只要删除这些接口(interface)就可以了。

ViewModel 是 MVVM 模式的一部分。在该模式中,ViewModel 不知道任何 View 。它暴露了 View 正在观察的流。您需要在 ViewModel 中包含:

private val _onUpdate = MutableLiveData<Event<Boolean>()
val onUpdate : LiveData<Boolean>
get() = _onUpdate

然后你可以在 View 中观察它,如下所示:

viewModel.onUpdate.observe(this, EventObserver {// Do what you need})

您可以引用这篇文章事件如何与 LiveData 配合使用:

https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

关于您的问题 Activity 如何运作。首先我们要清楚 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 将更新。在您开始观察的那一刻,您不仅观察 future 的数据,而且还接收最后一个数据。

那么在另一种情况下。您尝试访问服务器。但服务器回复说用户未通过身份验证。您想要要求用户进行身份验证。您可以使用 LiveData 来做到这一点。观察它并在触发时显示对话框。这里的问题是,如果用户旋转屏幕,您将再次观察到相同的数据并再次显示对话框。您不想这样做,所以您需要一个事件。工作原理:您有标志“hasBeenHandled”,如果某个观察者收到数据一次,则该标志将设置为 true,并且任何后续观察者都将收到 null。还有一个方法:peekContent,这样你就可以强制读取数据。 EventObserver 是一个处理样板代码的类。

如果您使用 LiveData,它会知道 Activity 何时处于正确的状态,并且当 Activity 死亡时它永远不会收到通知。

您还知道这两个 Activity 都引用了 ViewModel 的不同实例吗?如果你想分享一些东西,你需要在同一个 Activity 中拥有 Fragment。

你几乎不应该使用AndroidViewModel!!!

关于java - Activity结束后如何结束接口(interface)回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58216609/

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