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.