abstract class CoreActivity<VB : ViewBinding> : ScopeActivity(),
CoroutineScope,
LifecycleObserver {
...
private lateinit var binding: VB
...
/**
* Function to access ViewBinding object within Activity.
* */
protected fun binding(func: VB.() -> Unit) = launch { binding.run(func) }
}
在我当前为应用程序实现的 BaseActivity 中,我将绑定设为私有,以便对其子项不可变。
然后我做了 protected fun binding(func: VB.() -> Unit) = launch { binding.run(func) }
允许它的孩子在主线程中安全地访问 ViewBinding 的内容。
我的一位同事问我,他想以更多的方式访问视图。例如binding.textview.text = "Text"
然后我告诉他,为了不变性和线程安全,我特意将变量的可见性设为私有。
那么问题是 ViewBinding 默认是线程安全的吗?
ViewBinding 类的生成代码示例:
public final class ActivitySplashBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
private ActivitySplashBinding(@NonNull LinearLayout rootView) {
this.rootView = rootView;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static ActivitySplashBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivitySplashBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.activity_splash, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivitySplashBinding bind(@NonNull View rootView) {
if (rootView == null) {
throw new NullPointerException("rootView");
}
return new ActivitySplashBinding((LinearLayout) rootView);
}
}
在生成的类中,我没有看到任何线程管理的迹象,但这只是我的观察。