活动结束后如何结束接口回调

时间:2019-10-03 09:53:48

标签: java android

我对接口的功能有疑问。 我的两个班级都使用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();
        }
    ...
    }

1 个答案:

答案 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一起使用:

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

关于您的活动如何运作的问题。首先让我们弄清楚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 !!!