默认情况下,ViewBinding 线程安全吗?

时间:2021-03-24 01:39:56

标签: android android-viewbinding

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);
  }
}

在生成的类中,我没有看到任何线程管理的迹象,但这只是我的观察。

0 个答案:

没有答案