2016-05-03 15 views
3

次の状況が悪い設計ですか、何か重要なことを見落としていますか?それは今までにのみonCreate内部から呼ばれていたときにここでAndroidアクティビティonCreateメソッドによって呼び出された同期メソッド

コードが

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​​のですか?

私はそれが傷つけることはできないことを知っていますが、それはほとんど問題のポイントではありません。私が知る必要があるのは:なぜそれが必要ですか?

編集

完全なコードのソース:この場合https://github.com/googlesamples/android-play-location/blob/master/BasicLocationSample/app/src/main/java/com/google/android/gms/location/sample/basiclocationsample/MainActivity.java

+0

返信いただきありがとうございます。しかし残念ながら私はあなたの反応を理解していません。ありがとう。 –

+0

メソッドの現在の使用法では、いいえ、必要ではないと言います。実際には、なぜ1つのアプリケーションで同じAPIクライアントを構築しようとするスレッドが複数あるのかわかりません。 – CodeCody

+0

これはhttp://developer.android.com/training/location/retrieve-current.htmlからのものです。彼らのエンジニアはトップノッチと思われていて、アンドロイドを組み込んだので、ここで何が起こっているのだろうかと思う価値があります。 –

答えて

2

、​​は、呼の継続時間のオブジェクトをロックします。​​と宣言された他のメソッドがある場合は、それらのうちの1つだけが任意の時点で実行されます。たとえば、別のスレッドの同期メソッドからmGoogleApiClientにアクセスすると、同期により、他のスレッドが完全に構築されたオブジェクトまたはnull参照を参照するようになります。

それでも、実装が不適切である場合があります。より良いアプローチは、各メソッドをプライベートオブジェクト上で同期させることです。そのため、クラス外のコードは誤ってオブジェクトをロックして予期しない動作を引き起こすことはありません。 OTOHでは、コードの行数が少なく、同期がメソッド全体に適用されることが明白なので、​​のメソッドは例の方が優れていると主張できます。

この特定のケースでは、volatileが機能している可能性がありますが、どのようにビルダーのパターンに対応しているか分かりません。

いずれにしても、同期が必要かどうかを知るには、コードの...セクションの詳細を知る必要があります。

+0

返信いただきありがとうございます。コードを切り捨てるために...を追加しました。ソースはhttps://github.com/googlesamples/android-play-location/blob/master/BasicLocationSample/app/src/main/java/com/google/android/gms/location/sample/basiclocationsample/MainActivityにあります。 javal。あなたは一般的に並行性を説明しているようです。しかし、提供された文脈の中でこのキーワードがどのように適用されますか? –

+0

私はいくつかの可能性を見ています:(1) 'onConnectionSuspended()'のようなコールバックが任意のスレッド上で呼び出せれば、同期が役に立つかもしれません。もちろん、コールバック*は同期されていないので、そうではありません。 (2)synchronizedメソッドは 'protected'なので、おそらく開発者はmulti-threadedであった派生クラスで使用されることを予期していました。 (3)実際に必要だった他のプロジェクトからコピー&ペーストされている。どのような場合でも、 'mGoogleApiClient'があるスレッドからのみアクセスされた場合、そのスレッドへのアクセスを同期させる必要はありません。 – fadden

+0

あなたのご意見ありがとうございます。 +1。 –

関連する問題