2016-09-21 37 views
1

我只是试图使用Retrofit来发送api调用。服务器正在响应正确的数据。我使用邮递员(Chrome)进行了检查。我的代码如下SocketTimeOut使用改造时的异常

公共类MainActivity扩展活动器具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(); 

}

每当它是扔套接字超时例外。

任何解决方案将是很大的帮助。

回答

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秒但没有效果。

+0

我发现我的错误即 –

+0

而不是ApiInte rface apiService = ApiClient.getClient()。create(ApiInterface.class);我需要调用retrofit.create(ApiInterface.class);其他的事情都很好。 –

0

主题标签:插座关闭套接字超时

说明:改造维护其锁定套接字连接。

更多:https://github.com/square/okhttp/issues/3146

SOLUTION: 配置连接池喜欢下面的例子:

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

请记住,以纪念答案正确:)