2016-09-21 12 views
1

私はRetrofitを使用してポストAPIコールを試みています。サーバーは正しいデータで応答しています。Postman(Chrome)でチェックしました。次のように私のコードはRetrofitを使用中に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(); 

は私が改造2.1.0を使用しています、readTimeoutが0であることを忘れないでください。レトロフィットのデフォルトのタイムアウトは10秒です。私はreadTimeoutを設定しようとしましたが、60秒ですが効果はありません。

+0

として答えをマークすることを忘れないでください、私は私のミスを見つけましたApiInteの代わりに –

+0

rface apiService = ApiClient.getClient()。create(ApiInterface.class); retrofit.create(ApiInterface.class)を呼び出す必要があります。他のものは元気だった。 –

0

トピック・タグ:ソケットを閉じ、ソケットタイムアウト

説明:補強ソケットをロックしている接続を維持します。

より:https://github.com/square/okhttp/issues/3146

SOLUTION: のconfigure CONNECTIONPOOL例の下で好き:

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

正しい:)

関連する問題