[英]Android pause an observer when view is removed
我有兩個自定義視圖(畫布視圖),它們都有一個觀察者,可以在屏幕上觸發一個事件並在畫布上繪制一些東西。 我正在重用容器並通過刪除其他視圖在相同的父布局中渲染畫布。 現在,不管我的兩個觀點觀察者的價值觀是什么。
我嘗試了一個骯臟的黑客,我將一個 boolan 傳遞給兩個視圖,作為真正的一個,另一個在 switch 時是假的,這有點工作,但我不想要那樣。 因為這只是一個黑客。 誰能告訴我一個android的方式來做到這一點?
public class FakeViewOne extends View {
private EventViewModel eventViewModel;
private float l = 0.0f;
public FakeViewOne(Context context, View ParentView) {
super(context);
eventViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(EventViewModel.class);
eventViewModel.getTrigger().observe((LifecycleOwner) getContext(), new Observer<Float>() {
@Override
public void onChanged(Float val) {
l = val;
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* if l > 50 change background of a linearlayout
* draw a line on a canvas
* */
invalidate();
}
}
public class FakeViewTwo extends View {
private EventViewModel eventViewModel;
private float l = 0.0f;
public FakeViewTwo(Context context, View ParentView) {
super(context);
eventViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(EventViewModel.class);
eventViewModel.getTrigger().observe((LifecycleOwner) getContext(), new Observer<Float>() {
@Override
public void onChanged(Float val) {
l = val;
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* if l > 50 change background of a tile
*
* */
invalidate();
}
}
代碼在片段內,我在這兩個 FakeViews 之間切換。 當它們未呈現/不活動/從視圖中刪除時,如何使它們不觀察值。 我正在使用mycanvas.removeAllViews(); .
final RelativeLayout mycanvas = view.findViewById(R.id.myCanvas);
gestureViewModel.getGestureType().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
assert s != null;
mycanvas.removeAllViews();
switch (s){
case "shake":
ShakeControl(view,myView,mycanvas);
break;
case "move":
MoveControl(view,myView,mycanvas);
break;
}
}
});
我已經解決了在每個 FakeView 中刪除窗口分離觀察者的問題。
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.d("Detached","Head");
if (eventViewModel != null && eventViewModel.getTrigger().hasObservers()) {
eventViewModel.getTrigger().removeObservers((LifecycleOwner) ctx);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.