 <p>I will explain how solved this problem. </p> <p>First of all the refresh token process is critical process. In my application and most of applications doing this : If refresh token fails logout current user and warn user to login .(Maybe you can retry refresh token process by 2-3-4 times by depending you)</p> <p>I recreated my refresh token using <code>HttpUrlConnection</code> which simplest connection method. No cache , no retries , only try connection and get answer .</p> <p>So this is my new refresh token process :</p> <p>My refresh method:</p> <pre><code>public boolean refreshToken(String url,String refresh,String cid,String csecret) throws IOException { URL refreshUrl=new URL(url+"token"); HttpURLConnection urlConnection = (HttpURLConnection) refreshUrl.openConnection(); urlConnection.setDoInput(true); urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setUseCaches(false); String urlParameters = "grant_type=refresh_token&amp;client_id="+cid+"&amp;client_secret="+csecret+"&amp;refresh_token="+refresh; // Send post request urlConnection.setDoOutput(true); DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); int responseCode = urlConnection.getResponseCode(); Log.v("refresh http url","Post parameters : " + urlParameters); Log.v("refresh http url","Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(urlConnection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // handle response like retrofit, put response to POJO class by using Gson // you can find RefreshTokenResult class in my question Gson gson = new Gson(); RefreshTokenResult refreshTokenResult=gson.fromJson(response.toString(),RefreshTokenResult.class); if(responseCode==200) { //handle new token ... return true; } //cannot refresh Log.v("refreshtoken", "cannot refresh , response code : "+responseCode); return false; } </code></pre> <p>In authenticate method :</p> <pre><code>@Override public Request authenticate(Route route, Response response) throws IOException { String userRefreshToken="your refresh token"; String cid="your client id"; String csecret="your client secret"; String baseUrl="your base url" refreshResult=refreshToken(baseUrl,userRefreshToken,cid,csecret); if (refreshResult) { //refresh is successful String newaccess="your new access"; return response.request().newBuilder() .header("Authorization", newaccess) .build(); } else { //refresh failed , maybe you can logout user return null; } } </code></pre>