gpt4 book ai didi

Android LiveData 在 fragment 中创建多个观察者

转载 作者:行者123 更新时间:2023-12-04 17:32:41 24 4
gpt4 key购买 nike

在搜索了许多其他 SO 问题并阅读了文章之后,我仍然不明白为什么我的实现似乎不像其他示例那样执行。

我读过建议使用 getViewLifecycleOwner()在 fragment 内注册任何 LiveData 观察者以正确处理 fragment 的生命周期时。

但是,在我的 fragment 中 OnActivityCreated方法(当 fragment 显示在屏幕上时会被调用两次)我似乎有所不同 LifecycleOwner来自对 getViewLifecycleOwner() 的调用的对象我相信这是我将多个观察者注册到我的 LiveData 对象的原因。

我如何防止这种情况发生/我做错了什么?

我在代码中添加了大量日志记录,如下所示:

主 Activity

   public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, new LiveDataTestFragment())
.commit();

Log.d("debugger2", "Activity: " + this.hashCode());
}
}

LiveDataTestFragment
public class LiveDataTestFragment extends Fragment {

private LiveDataViewModel viewModel;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_live_data_test, container, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

viewModel = ViewModelProviders.of(getActivity()).get(LiveDataViewModel.class);

Log.d("debugger2", "ViewModel: " + viewModel.hashCode());

LiveData<String> liveData = viewModel.getLiveData();
Log.d("debugger2", "LiveData: " + liveData.hashCode());

LifecycleOwner lifecycleOwner = getViewLifecycleOwner();
Log.d("debugger2", "LifeCycleOwner: " + lifecycleOwner.hashCode());

liveData.observe(lifecycleOwner, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("debugger2", "observer hash: " + this.hashCode());
}
});
}
}

日志猫:
D: Activity: 242098714
D: ViewModel: 149122972
D: LiveData: 58736037
D: LifeCycleOwner: 50378106
D: ViewModel: 149122972
D: LiveData: 58736037
D: LifeCycleOwner: 245135826
D: observer hash: 204470220
D: observer hash: 226765595

最佳答案

new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("debugger2", "observer hash: " + this.hashCode());
}
}

可能是你观察者的这部分负责创建多个 hashCode()您可以创建此 observer如果您需要使用以下代码,只需一次并多次调用它:
private Observer<String> singleObserver = Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("debugger2", "observer hash: " + this.hashCode());
}
}

并像这样使用它:
// your previous code
LiveData<String> liveData = viewModel.getLiveData();
liveData.observe(lifecycleOwner, singleObserver);
// rest of your code

希望它会起作用。

关于Android LiveData 在 fragment 中创建多个观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58039949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com