2017-10-16 2 views
0

Ich brauche den synchronen Aufruf, um das Auth-Token zu aktualisieren, aber ich habe 'NetworkOnMainThreadException'.Android Retrofit 2 synchroner Anruf

@Synchronized 
fun refreshToken(): String? { 
    val refreshToken = AuthService.getRefreshToken(context) 
    var id_token: String? = null 

    val call = apiService.refreshToken("refresh_token", refreshToken) 
      val response = call.execute() 

      id_token = response.body() 

      if (id_token != null) 
      { 
       AuthService.saveTokens(context, id_token) 
      } 
     }) 

    return id_token 
} 

Wie soll ich die "NetworkOnMainThreadException" vermeiden?

D/OkHttp: --> POST https://localhost/api/auth/refresh http/1.1 (372-byte body) 
D/OkHttp: <-- HTTP FAILED: android.os.NetworkOnMainThreadException 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.test, PID: 1537 
        android.os.NetworkOnMainThreadException 
        ... 
+0

Synchron Anrufe verursachen nicht diese Ausnahme nennen sollte. Das Aufrufen des Netzwerks an einer beliebigen Stelle im Haupt-Thread funktioniert. Bitte zeigen Sie eine [mcve] und die vollständige logcat –

+0

Auch nicht das Problem, aber nach dem Abrufen des Token, kann dies einfach asynchron mit 'call.enqueue()' getan werden –

Antwort

0

Der beste Weg zur Implementierung von refreshToken mit Retrofit ist die Verwendung von Authenticator.

class TokenAuthenticator : Authenticator { 
    override fun authenticate(route: Route?, response: Response?): Request { 
     //call your Refresh Token here 
    } 
} 

schließlich TokenAuthenticator auf Ihre OkHttpClient

val httpClient : OkHttpClient.Builder = OkHttpClient.Builder() 
httpClient.authenticator (TokenAuthenticator()) 

, wenn Sie sich mit Ihrer Art und Weise bestehen setzen Sie Retrofit api in einem anderen Thread

Verwandte Themen