2016-05-05 8 views
2

Wie würde der Scope mit Auth Tokens funktionieren? Ich kann meine Retrofit-Instanz erst erstellen, wenn ich einen Interzeptor hinzufügen kann, der sie mit meinem Authentifizierungs-Token signiert. Daher möchte ich Retrofit erstellen, wenn die Authentifizierungs-Token verfügbar sind (nach dem Anmelden). Wie bekomme ich in dieser Situation das richtige Scope?Bester Scope in Dagger2 für Okhttp3 mit dynamischen Interceptors

Vielen Dank!

Antwort

3

Es gibt keine beste Weise, dies zu tun, und es kann auch davon abhängen, wie oft Sie Ihre Retrofit Instanzen ändern/neu erstellen.

Was besser ist oder was besser zu Ihrem Anwendungsfall passt, hängt sehr stark davon ab, was Sie erreichen möchten und wie. Es gibt viele Möglichkeiten, ist wie das, was Sie versuchen, ist möglich, zu erreichen, aber im Allgemeinen haben Sie 2 Möglichkeiten

  • Erstellen Sie einen neuen Client für jedes Retrofit-Instanz (zB wenn Sie nur die Benutzer in einmal anmelden), so würde man nur fügen Sie den Client im gleichen Umfang
  • erstellen @Singleton Instanz okhttp3 und ändern Sie den Client, wenn mithilfe der newBuilder()

ich denke, der erste Punkt ist selbsterklärend erforderlich, nur Ihren Client erstellen, wenn Sie Retrofit erstellen, benutze den gleichen Umfang und werde erledigt.


Der zweite Ansatz verwendet Okhttp3 Merkmal der newBuilder() Methode, indem Sie Ihre Abfangjäger zum okhttp Client hinzuzufügen, wenn Ihre Retrofit-Instanz erstellen.

Es würde wie folgt aussehen:

// Some singleton client to maybe also use in other parts of your app 
@Singleton 
OkHttpClient provideClient() { return new OkHttpClient(); } 

// creating your retrofit client 
@UserScope 
Retrofit provideRetrofit(OkHtpClient client, Interceptor userInterceptor) { 
    return new Retrofit.Builder() 
      .client(client.newBuilder() // new builder to modify okhttp3 
       .addNetworkInterceptor(interceptor) 
       .build()) 
      /* other settings */ 
      .build(); 
} 

Wenn Sie kreativ können Sie auch aussetzen nur setCredentials() Methode auf Abfangjäger, dann kann man sie nur einmal erstellen und wiederverwenden alle Objekte durch Hinzufügen sie zum @Singleton Bereich. Sie würden dann Ihren Benutzer ändern, indem Sie auf Ihren Interceptor zugreifen und diesen ändern, auch wenn dies meiner bescheidenen Meinung nach kein sauberer Ansatz ist.