observe 方法 vs Observer<>
observe method vs Observer<>
我正在阅读 Android 与 LiveData 和 ViewModels 相关的文档,我遇到了一个让我感到困惑的条目。
在
LiveData Overview
示例代码像这样实现观察者
public class NameActivity extends AppCompatActivity {
private NameViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other code to setup the activity...
// Get the ViewModel.
model = new ViewModelProvider(this).get(NameViewModel.class);
// 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);
}
};
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
model.getCurrentName().observe(this, nameObserver);
}}
创建更新 UI 的 Observer<String>
和观察 LiveData
的 .observe
的两步过程
而在 ViewModel Overview 中,观察者的实现是
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
});
}
}
单人.observe
。我做了一些测试,看起来单个 .observe
也能够更新 UI.
我还注意到 LiveData Overview 在 Activity 中实现了观察,而 ViewModel Overview 在片段中。这可能是观察在 2 步 vs 1 步过程中实施的原因吗?
一个比另一个好吗?或者它们是等效的书写方式?
两者之间的实际区别很小。这只是语法问题。
在第一个示例中,代码使用 new Observer<String>()
创建一个实现 Observer 接口的对象的新实例。此实例传递给 observe()
.
第二个示例实际上做了几乎完全相同的事情,除了它使用 Java 8 lambda syntax 折叠了很多用于定义 Observer 对象的代码,并简单地定义了新的 Observer 对象内联到调用 observe()
,甚至没有给它命名。
无论你使用new Observer()
还是lambda语法,最终结果基本相同——创建并传递一个新的Observer实例。
我正在阅读 Android 与 LiveData 和 ViewModels 相关的文档,我遇到了一个让我感到困惑的条目。
在 LiveData Overview 示例代码像这样实现观察者
public class NameActivity extends AppCompatActivity {
private NameViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other code to setup the activity...
// Get the ViewModel.
model = new ViewModelProvider(this).get(NameViewModel.class);
// 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);
}
};
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
model.getCurrentName().observe(this, nameObserver);
}}
创建更新 UI 的 Observer<String>
和观察 LiveData
的 .observe
的两步过程
而在 ViewModel Overview 中,观察者的实现是
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
});
}
}
单人.observe
。我做了一些测试,看起来单个 .observe
也能够更新 UI.
我还注意到 LiveData Overview 在 Activity 中实现了观察,而 ViewModel Overview 在片段中。这可能是观察在 2 步 vs 1 步过程中实施的原因吗?
一个比另一个好吗?或者它们是等效的书写方式?
两者之间的实际区别很小。这只是语法问题。
在第一个示例中,代码使用 new Observer<String>()
创建一个实现 Observer 接口的对象的新实例。此实例传递给 observe()
.
第二个示例实际上做了几乎完全相同的事情,除了它使用 Java 8 lambda syntax 折叠了很多用于定义 Observer 对象的代码,并简单地定义了新的 Observer 对象内联到调用 observe()
,甚至没有给它命名。
无论你使用new Observer()
还是lambda语法,最终结果基本相同——创建并传递一个新的Observer实例。