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

标签 java android

我对接口(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/

相关文章:

java - 如何使计数器每天只添加一次(android)?

android - Android 上的 Linux 容器

java - 如何从另一种方法访问在一种方法中初始化的字符串数组?

android - 在 android studio 中动态禁用 EditText 的键盘弹出窗口

java - 检查 String 是否与 Java 中的特定 MessageFormat 匹配?

java - Double 小于零的双重转换

java - 正确设置简单的服务器端缓存

android - Activity onPause 奇怪的 Action

java - 确定正方形和矩形之间关系的算法

java - 无法在 Java Android 中使用 dagger2 在 fragment 中注入(inject)依赖项