我在我的应用程序中使用Retrofit库,我想设置60秒的超时。Retrofit有办法做到这一点吗?
我这样设置Retrofit:
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.build();
如何设置超时时间?
我在我的应用程序中使用Retrofit库,我想设置60秒的超时。Retrofit有办法做到这一点吗?
我这样设置Retrofit:
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.build();
如何设置超时时间?
当前回答
在Kotlin中,您可以为retrofit2配置超时by
创建OkHttpClient对象(默认值为10秒)
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
然后将此对象添加到您的改造生成器中
val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.baseUrl(BASE_URL)
.build()
并从这个包中导入TimeUnit
import java.util.concurrent.TimeUnit
其他回答
在Kotlin:
首先,您应该创建一个OkHttp客户端并添加Retrofit构建器
fun create(): Retrofit {
val client = OkHttpClient.Builder()
.readTimeout(60,TimeUnit.SECONDS)
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
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);
}
}
您可以在底层HTTP客户机上设置超时。如果您没有指定客户端,Retrofit将创建一个具有默认连接和读取超时的客户端。要设置自己的超时,需要配置自己的客户机并将其提供给RestAdapter.Builder。
一种选择是使用OkHttp客户端,同样来自Square。
1. 添加库依赖项
在构建中。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以后的okhttp版本。X,你必须这样设置依赖项:
compile 'com.squareup.okhttp3:okhttp:x.x.x'
并使用构建器模式设置客户端:
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
更多信息在超时
编辑2
2.x以来的更新版本。X也使用构建器模式,因此将上面的返回块更改为:
return new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
如果使用类似于我的providesRestAdapter方法的代码,则将方法返回类型更改为Retrofit。
更多信息在改造2 -从1.9升级指南
ps:如果你的minSdkVersion大于8,你可以使用TimeUnit。分钟:
okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);
有关单位的详细信息,请参见TimeUnit。
对于OkHttp3用户的Retrofit1.9,这里是解决方案,
.setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))
我找到了这个例子
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;
}
}