簡體   English   中英

活動結束后如何結束接口回調

[英]How to end interface callback after activity end

我對接口的功能有疑問。 我的 class 都使用 AndroidViewModel,它提供 Application 作為構造函數的參數。

我的問題是,當活動 A 開始活動 B 時,為什么 class 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 中保留指向該活動的引用?

 Context context;
 context = this;

為什么要以這種方式使用 ViewModel? 它會比你的活動更長壽。 正如 Pawel 所說,您必須了解生命周期。 所以只需刪除這些接口。

ViewModel 是 MVVM 模式的一部分。 在該模式中,ViewModel 不知道任何視圖。 它暴露了 View 正在觀察的 stream。 您需要在 ViewModel 中有:

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

然后你可以像這樣在視圖中觀察它:

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

你可以參考這篇文章Events are working with 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);
            }
        };

現在,一旦您將名稱設置為 no 每次設備輪換,名稱就會出現,並且 TextView 將被更新。 在您開始觀察的那一刻,您不僅會觀察未來的數據,還會收到最后一個數據。

所以在另一種情況下。 您嘗試訪問服務器。 但服務器回復說用戶未通過身份驗證。 您想要求用戶進行身份驗證。 你可以用 LiveData 做到這一點。 觀察它並在觸發時顯示對話框。 這里的問題是,如果用戶旋轉屏幕,您將再次觀察到相同的數據並再次顯示對話框。 你不想這樣做,所以你需要一個事件。 它是如何工作的:你有標志“hasBeenHandled”,如果某個觀察者接收到數據一次,則該標志設置為 true,任何后續觀察者都將收到 null。 還有一種方法:peekContent,這樣您就可以強制讀取數據。 EventObserver 是一個 class 來處理樣板代碼。

如果您使用 LiveData,它將知道 Activity 何時在正確的 State 中,並且當它死亡時永遠不會收到通知。

您還知道這兩個活動都指的是 ViewModel 的不同實例嗎? 如果你想分享一些東西,你需要在同一個 Activity 中有 Fragments。

你幾乎不應該使用 AndroidViewModel !!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM