さて、私はRetrofitを使用することで迷っています...まず、Retrofitインスタンスによって作成されたサービスインスタンスを保持するSingletonヘルパークラスを作成します。サービスを取得してHTTPリクエストを行うのは非常に便利ですが、ヘルパーインスタンスが静的であるため、SharedPreferencesからアクセストークンを取得できないことがわかります。 Authenticatorインターフェイスを使用して認証を処理するため、要求時にアクセストークンを渡すことはできません。私はアプリケーションクラスを拡張し、静的フィールドでアプリケーションインスタンスを保持しようとするが、Android Studioは私に警告を与える(Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)
)。1つのグローバルRetrofitインスタンスを使用するか、Androidでリクエストごとに1つ作成する必要がありますか?
これで、別の選択肢があります:各リクエストに対して、アクセストークンを受け入れ、Retrofitインスタンスを構築し、サービスインスタンスを作成し、要求を行う静的ヘルパーメソッドを作成します。今私はこれがベストプラクティスかどうかを混乱させています。 1つのサービスインスタンスの再利用と各リクエストのサービスの作成の違いは何ですか?
PS:上記のservice
という単語は、ではなく、someRetrofit.create(someServiceInterface.class)
によって作成されたサービスインスタンスを指します。
私のプロジェクトでは、メモリリークについてのこの警告は表示されません。しかし、とにかく、それは唯一の警告です。アプリケーションへの静的な参照を保持するのに間違ったことはありません。私はそれについてここで答えているhttp://stackoverflow.com/questions/14057273/android-singleton-with-global-context/14057777#14057777。だから私の提案は、単一のアプリケーションを使用することであり、この警告について心配する必要はありません。 – Budius
@Budius実際には、 'someRetrofit.create(xxx.class) 'によって作成された単一インスタンスを再利用して、各リクエストでこれを行うことの違いを知りたいと思っています。 – Perqin
私はそれほど深く掘り下げることはありませんが、インスタンスはスレッド、コールバック、インターセプタを制御/保持しているようですので、毎回新しいスレッドを作成するべきではないはずです。 – Budius