Android Activity onCreate方法

时间:2016-05-03 21:50:33

标签: java android multithreading android-activity

以下情况设计不佳还是我忽略了重要的事情?

这是代码

public class MainActivity extends AppCompatActivity … {

  …

  @Override
  public void onCreate(Bundle savedInstanceState){
     …
     buildGoogleApiClient();
  }

  /**
   * Builds a GoogleApiClient. Uses the addApi() method to request the LocationServices API.
   */
    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }
}

为什么buildGoogleApiClient synchronized只能从onCreate内部调用?

我知道它不会受到伤害,但这不是问题的关键。我需要知道的是:为什么有必要?

修改

源代码为完整代码:https://github.com/googlesamples/android-play-location/blob/master/BasicLocationSample/app/src/main/java/com/google/android/gms/location/sample/basiclocationsample/MainActivity.java

1 个答案:

答案 0 :(得分:3)

在这种情况下,synchronized将在调用期间锁定对象。如果还有其他方法也声明了synchronized,那么在任何给定时间只会执行其中一个方法。例如,如果从另一个线程上的synchronized方法访问mGoogleApiClient,则同步将确保另一个线程看到完全构造的对象或空引用。

即使这样,你仍然可以证明它是一个糟糕的实现。更好的方法是让每个方法在私有对象上同步,这样类外的代码就不会无意中锁定对象并导致意外行为。 OTOH,可以说synchronized方法对于示例来说更好,因为代码行更少,并且同步适用于整个方法。

在这种特殊情况下,volatile可能有效,但我不确定如何使用构建器模式。

无论如何,您需要了解有关...部分代码的更多信息,以了解是否需要进行同步。