如何在改造库中设置超时?
Posted
技术标签:
【中文标题】如何在改造库中设置超时?【英文标题】:How to set timeout in Retrofit library? 【发布时间】:2015-06-05 12:18:32 【问题描述】:我在我的应用程序中使用Retrofit 库,我想将超时设置为 60 秒。 Retrofit 有办法做到这一点吗?
我这样设置改造:
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.build();
如何设置超时时间?
【问题讨论】:
【参考方案1】:您可以在底层 HTTP 客户端上设置超时。如果您不指定客户端,Retrofit 将创建一个具有默认连接和读取超时的客户端。要设置自己的超时时间,您需要配置自己的客户端并将其提供给RestAdapter.Builder
。
一个选项是使用同样来自 Square 的 OkHttp 客户端。
1.添加库依赖
在 build.gradle 中,包含以下行:
compile 'com.squareup.okhttp:okhttp:x.x.x'
x.x.x
是所需的库版本。
2。设置客户端
例如,如果您想设置 60 秒的超时,请在版本 2 之前的 Retrofit 和版本 3 之前的 Okhttp 执行此操作(对于较新的版本,请参阅编辑):
public RestAdapter providesRestAdapter(Gson gson)
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
return new RestAdapter.Builder()
.setEndpoint(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.setClient(new OkClient(okHttpClient))
.build();
编辑 1
对于3.x.x
以后的 okhttp 版本,您必须这样设置依赖关系:
compile 'com.squareup.okhttp3:okhttp:x.x.x'
并使用构建器模式设置客户端:
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
更多信息Timeouts
编辑 2
自2.x.x
以来的改造版本也使用构建器模式,因此将上面的返回块更改为:
return new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
如果使用像我的providesRestAdapter
方法这样的代码,则将方法返回类型更改为Retrofit。
更多信息Retrofit 2 — Upgrade Guide from 1.9
ps:如果你的minSdkVersion大于8,可以使用TimeUnit.MINUTES
:
okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);
有关单位的更多详细信息,请参阅TimeUnit。
【讨论】:
在新版本的okhttp中没有看到setReadTimeout,有什么新方法吗? 我正在使用 okhttp3,对我来说,我使用了以下代码:new okhttp3.OkHttpClient().newBuilder(); okHttpClient.readTimeout(60, TimeUnit.SECONDS); okHttpClient.writeTimeout(60, TimeUnit.SECONDS); okHttpClient.connectTimeout(60, TimeUnit.SECONDS);新 Retrofit.Builder() .client(okHttpClient.build()) @lucasddaniel 您可以使用编辑后的答案并将 OkHttpClient 的声明名称放置到您的改造构建器中,如下所示“改造改造建造者名称 = 新改造。建造者()。客户端(okttpclientName)。构建();' @Solace 我有这个方法:public Gson providesGson() return new GsonBuilder().create();
。所以我这样做:Gson gson = module.providesGson(); RestAdapter adapter = module.providesRestAdapter(gson);
。其中模块是具有所有这些方法的正确类的实例
如果你使用 OkHttp3,你必须在 Gradle 导入中使用 compile 'com.squareup.okhttp3:okhttp:3.x.x'
,就像 Teo 下面的回答一样【参考方案2】:
我正在使用 Retrofit 1.9 来获取 XML。
public class ServicioConexionRetrofitXML
public static final String API_BASE_URL = new GestorPreferencias().getPreferencias().getHost();
public static final long tiempoMaximoRespuestaSegundos = 60;
public static final long tiempoMaximoLecturaSegundos = 100;
public static final OkHttpClient clienteOkHttp = new OkHttpClient();
private static RestAdapter.Builder builder = new RestAdapter.Builder().
setEndpoint(API_BASE_URL).
setClient(new OkClient(clienteOkHttp)).setConverter(new SimpleXMLConverter());
public static <S> S createService(Class<S> serviceClass)
clienteOkHttp.setConnectTimeout(tiempoMaximoRespuestaSegundos, TimeUnit.SECONDS);
clienteOkHttp.setReadTimeout(tiempoMaximoLecturaSegundos, TimeUnit.SECONDS);
RestAdapter adapter = builder.build();
return adapter.create(serviceClass);
如果您使用的是 Retrofit 1.9.0 和 okhttp 2.6.0,请添加到您的 Gradle 文件中。
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.6.0'
// Librería de retrofit para XML converter (Simple) Se excluyen grupos para que no entre
// en conflicto.
compile('com.squareup.retrofit:converter-simplexml:1.9.0')
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
注意:如果您需要获取 JSON,只需从上面的代码中删除即可。
.setConverter(new SimpleXMLConverter())
【讨论】:
【参考方案3】:这些答案对我来说已经过时了,所以这就是结果。
添加 OkHttp,在我的情况下版本是3.3.1
:
compile 'com.squareup.okhttp3:okhttp:3.3.1'
然后在构建改造之前,请执行以下操作:
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
【讨论】:
我的错,我错过了() 60 秒后会发生什么?我们可以在那里显示任何提示吗? @ArnoldBrown 您的改造调用将失败,这将调用 onFailure()【参考方案4】:public class ApiModule
public WebService apiService(Context context)
String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//.addNetworkInterceptor(networkInterceptor)
.build();
return new Retrofit.Builder().baseUrl(mBaseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build().create(WebService.class);
【讨论】:
【参考方案5】:这将是为每个服务设置超时的最佳方式(将超时作为参数传递)
public static Retrofit getClient(String baseUrl, int serviceTimeout)
Retrofit retrofitselected = baseUrl.contains("http:") ? retrofit : retrofithttps;
if (retrofitselected == null || retrofitselected.equals(retrofithttps))
retrofitselected = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(getGson().create()))
.client(!BuildConfig.FLAVOR.equals("PRE") ? new OkHttpClient.Builder()
.addInterceptor(new ResponseInterceptor())
.connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.build() : getUnsafeOkHttpClient(serviceTimeout))
.build();
return retrofitselected;
不要错过 OkHttpClient 的这个。
private static OkHttpClient getUnsafeOkHttpClient(int serviceTimeout)
try
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]
new X509TrustManager()
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers()
return new java.security.cert.X509Certificate[];
;
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier()
@Override
public boolean verify(String hostname, SSLSession session)
return true;
);
OkHttpClient okHttpClient = builder
.addInterceptor(new ResponseInterceptor())
.connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.build();
return okHttpClient;
catch (Exception e)
throw new RuntimeException(e);
希望这对任何人都有帮助。
【讨论】:
【参考方案6】:对于使用 OkHttp3 用户的 Retrofit1.9,这里是解决方案,
.setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))
【讨论】:
【参考方案7】:我找到了这个例子
https://github.com/square/retrofit/issues/1557
这里我们在构建 API REST 服务实现之前设置自定义 url 客户端连接客户端。
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import retrofit.Endpoint
import retrofit.RestAdapter
import retrofit.client.Request
import retrofit.client.UrlConnectionClient
import retrofit.converter.GsonConverter
class ClientBuilder
public static <T> T buildClient(final Class<T> client, final String serviceUrl)
Endpoint mCustomRetrofitEndpoint = new CustomRetrofitEndpoint()
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(mCustomRetrofitEndpoint)
.setConverter(new GsonConverter(gson))
.setClient(new MyUrlConnectionClient())
RestAdapter restAdapter = builder.build()
return restAdapter.create(client)
public final class MyUrlConnectionClient extends UrlConnectionClient
@Override
protected HttpURLConnection openConnection(Request request)
HttpURLConnection connection = super.openConnection(request);
connection.setConnectTimeout(15 * 1000);
connection.setReadTimeout(30 * 1000);
return connection;
【讨论】:
【参考方案8】:public class ApiClient
private static Retrofit retrofit = null;
private static final Object LOCK = new Object();
public static void clear()
synchronized (LOCK)
retrofit = null;
public static Retrofit getClient()
synchronized (LOCK)
if (retrofit == null)
Gson gson = new GsonBuilder()
.setLenient()
.create();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(40, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
// Log.e("jjj", "=" + (MySharedPreference.getmInstance().isEnglish() ? Constant.WEB_SERVICE : Constant.WEB_SERVICE_ARABIC));
retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(Constants.WEB_SERVICE)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit;
`enter code here`
public static RequestBody plain(String content)
return getRequestBody("text/plain", content);
public static RequestBody getRequestBody(String type, String content)
return RequestBody.create(MediaType.parse(type), content);
-------------------------------------------------------------------------
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!【参考方案9】:public class ApiClient
private static Retrofit retrofit = null;
private static final Object LOCK = new Object();
public static void clear()
synchronized (LOCK)
retrofit = null;
public static Retrofit getClient()
synchronized (LOCK)
if (retrofit == null)
Gson gson = new GsonBuilder()
.setLenient()
.create();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(40, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(Constants.WEB_SERVICE)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit;
public static RequestBody plain(String content)
return getRequestBody("text/plain", content);
public static RequestBody getRequestBody(String type, String content)
return RequestBody.create(MediaType.parse(type), content);
@FormUrlEncoded
@POST("architect/project_list_Design_files")
Call<DesignListModel> getProjectDesign(
@Field("project_id") String project_id);
@Multipart
@POST("architect/upload_design")
Call<BoqListModel> getUpLoadDesign(
@Part("user_id") RequestBody user_id,
@Part("request_id") RequestBody request_id,
@Part List<MultipartBody.Part> image_file,
@Part List<MultipartBody.Part> design_upload_doc);
private void getMyProjectList()
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<MyProjectListModel> call = apiService.getMyProjectList("",Sorting,latitude,longitude,Search,Offset+"",Limit);
call.enqueue(new Callback<MyProjectListModel>()
@Override
public void onResponse(Call<MyProjectListModel> call, Response<MyProjectListModel> response)
try
Log.e("response",response.body()+"");
catch (Exception e)
Log.e("onResponse: ", e.toString());
@Override
public void onFailure(Call<MyProjectListModel> call, Throwable t)
Log.e( "onFailure: ",t.toString());
);
// file upload
private void getUpload(String path,String id)
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
MultipartBody.Part GalleryImage = null;
if (path!="")
File file = new File(path);
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
GalleryImage = MultipartBody.Part.createFormData("image", file.getName(), reqFile);
RequestBody UserId = RequestBody.create(MediaType.parse("text/plain"), id);
Call<uplod_file> call = apiService.geUplodFileCall(UserId,GalleryImage);
call.enqueue(new Callback<uplod_file>()
@Override
public void onResponse(Call<uplod_file> call, Response<uplod_file> response)
try
Log.e("response",response.body()+"");
Toast.makeText(getApplicationContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show();
catch (Exception e)
Log.e("onResponse: ", e.toString());
@Override
public void onFailure(Call<uplod_file> call, Throwable t)
Log.e( "onFailure: ",t.toString());
);
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
【讨论】:
请解释一下你的答案。【参考方案10】:在 Kotlin 中:
首先你应该创建一个OkHttp client
并添加Retrofit builder
fun create(): Retrofit
val client = OkHttpClient.Builder()
.readTimeout(60,TimeUnit.SECONDS)
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
【讨论】:
以上是关于如何在改造库中设置超时?的主要内容,如果未能解决你的问题,请参考以下文章