绑定服务时保持mBound标志是否相关?

时间:2015-07-30 08:59:27

标签: android android-service android-service-binding

正如有关bound services的文档中所述,mBound布尔值用于了解服务是否绑定在活动中。以下是文档中给出的代码示例的摘录:

public class BindingActivity extends Activity {
  LocalService mService;
  boolean mBound = false;

  private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
      LocalBinder binder = (LocalBinder) service;
      mService = binder.getService();
      mBound = true;
    }
}

为什么要使用其他成员,而不是将mService设置为null,如果它没有绑定?这似乎是多余的,可能error-prone

1 个答案:

答案 0 :(得分:1)

您无需在活动中添加其他标记。

附加标志会增加数据一致性和原子性的风险,例如:

  • 数据一致性:有人修改此代码可能会因使用mBoundmService != null而感到困惑,就像您一样。他们可能会担心此问题并添加assert(mBound == mService != null);支票。

  • 原子性:在严格的线程安全条件下,onServiceConnected可能会在mBound = true;之前被阻止,而在其他线程中,mService和{{ 1}}可能在州内发生冲突。

  • 复杂性:如果编辑代码的其他人错误地将mBound修改为其他状态会怎样?

希望这可以提供帮助。