2012-05-15 21 views
7

getSystemServiceのドキュメントでは、へのアドバイスは、様々な異なるコンテキストの間のサービスオブジェクトを共有していません。getSystemService(...)の結果をキャッシュする必要がありますか?

単一のコンテキストでは、サービスオブジェクトをonCreate()のインスタンスフィールドに割り当てるか、使用時に取得する必要がありますか?慣用的な用法は何ですか?

答えて

5

システムサービスオブジェクトを保持するにはコストがほとんどかからないので、データメンバで保持することをお勧めします。 onCreate()のいずれかを取得するか、必要な場合にはあなた次第であるかどうかを遅延初期化するかどうか。

を使用すると、システムサービスオブジェクトに大きなコストがかかることに注意してください。 LocationManagerインスタンスを保持するのは安価です。 GPSを使用して(たとえば、requestLocationUpdates()経由で)安価ではありません。

+0

感謝を - ここで私はそれを行う方法です。 –

+0

なぜサービスを保管することをお勧めしますか?あなたは 'getSystemService'を呼び出すために多くの費用がかかると思いますか? – Sam

+1

@ Sam: "getSystemServiceを呼び出すのには多額の費用がかかりますか?"おそらく巨大ではありませんが、IPCが関係する可能性があります。 – CommonsWare

0

私は同じことをお約束していました。 (コンテキストから継承)サービス内のいくつかのサービスオブジェクトは、その後、他の人より高価であるポインタのための

private static volatile LocationManager lm; // not final - we need a context 

private LocationManager lm() { 
    LocationManager result = lm; 
    if (result == null) { 
     synchronized (LocationMonitor.class) { // my service 
      result = lm; 
      if (result == null) 
       result = lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 
    return result; 
} 
関連する問題