使用Retrofit时出现SocketTimeOut异常

时间:2016-09-21 23:25:51

标签: android

我只是想使用Retrofit进行后api调用。服务器正在使用正确的数据进行响应。我使用Postman(Chrome)进行了检查。我的代码如下

公共类MainActivity扩展Activity实现retrofit2.Callback> {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


  final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(6, TimeUnit.MINUTES)
            .readTimeout(6, TimeUnit.MINUTES)
            .writeTimeout(6, TimeUnit.MINUTES)
            .build();


    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://kokanplaces.com/")
            .addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient)
            .build();

    // prepare call in Retrofit 2.0

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    Call<List<CityModel>> call = apiService.getCitiesList();;
    //asynchronous call
    call.enqueue(this);
}


@Override
public void onResponse(Call<List<CityModel>> call, Response<List<CityModel>> response) {
    int code = response.code();
    if (code == 200) {
         for (CityModel cityModel : response.body()) {
               System.out.println(
                        cityModel.getCityname() + " (" + cityModel.getCityId() + ")");
            }           


    } else {
        Toast.makeText(this, "Did not work: " + String.valueOf(code), Toast.LENGTH_LONG).show();
    }

}

@Override
public void onFailure(Call<List<CityModel>> call, Throwable t) {
    Toast.makeText(this, "failure", Toast.LENGTH_LONG).show();
    System.out.println(t.fillInStackTrace());
    t.printStackTrace();

}

}

public interface ApiInterface {
@POST("wp-json/getCities")
Call<List<CityModel>> getCitiesList();

}

每次抛出套接字超时异常。

任何解决方案都会有很大的帮助。

2 个答案:

答案 0 :(得分:1)

我之前遇到过像你这样的问题。我通过添加自定义OkHttpClient

进行了修复
Constants.TIMEOUT_CONNECTION = 60;
private OkHttpClient getOkHttpClient() {
        final OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(0, TimeUnit.NANOSECONDS)
                .connectTimeout(Constants.TIMEOUT_CONNECTION, TimeUnit.SECONDS)
                .writeTimeout(Constants.TIMEOUT_CONNECTION, TimeUnit.SECONDS)
//                .sslSocketFactory(getSSLSocketFactory())
                .build();
        return okHttpClient;
    }

和retrofitAdapter:

retrofitAdapter = new Retrofit.Builder()
                        .baseUrl(ConstantApi.BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .client(getOkHttpClient())
                        .build();

记住readTimeout为0,我正在使用改装2.1.0。改造的默认超时为10秒。我试图设置readTimeout是60秒但没有效果。

答案 1 :(得分:0)

Topic tags: Socket closed, socket timeout

Explanation: Retrofit maintains connection which is locking socket.

More: https://github.com/square/okhttp/issues/3146

SOLUTION: configure connectionPool like in below example:

private OkHttpClient getOkHttpClient() {
    final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectionPool(new ConnectionPool(0,1,TimeUnit.NANOSECONDS))
            .build();
    return okHttpClient;
}

Please remember to mark answer as correct :)