[英]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:
關於您的事件如何運作的問題。 讓我們先弄清楚 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.