使用Retrofit / OkHttpClient对WiFi上的并发用户进行Android SocketTimeoutException

时间:2018-03-23 02:05:01

标签: android sockets retrofit2 okhttp socket-timeout-exception

我看到了类似的问题,但无法得到答案。

我在linux服务器上读取mysql到php的数据然后把它放在列表中。 在蜂窝网络中,可以有多个并发连接,但是在同一个Wi-Fi网络中不可能同时拥有多个连接。

当然,网络浏览器没有问题,但只有连接到智能手机终端时才会出现问题。 我使用了SAMSUNG Galaxy 6和4等几个终端。

我不认为这是一个编码错误。

如果第一个连接的终端从WIFI网络调用call.enqueue,则很可能在使用后不释放套接字。

如果某人已经完成并解决了它,请给我一个想法!

请注意,来源如下:

public class ApiService {
    public static <S> S createService(Class<S> serviceClass) {
        OkHttpClient httpClient=new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(""http://www.~~~~~~~~~~~~~~~/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient).build();
        return retrofit.create(serviceClass);
    }
}



@GET("center_list_select_by_center_gubun.php")
@Headers({"Content-Type: application/json; charset=utf-8"})
Call<CenterModel> getCenterListByCenterGubun(@Query("center_gubun") String center_gubun,
                                            @Query("article_id") String article_id,
                                            @Query("on_list") String on_list);


api = ApiService.createService(ApiInterface.class);
Call<CenterModel> call = api.getCenterListByCenterGubun(tab_gubun_s, String.valueOf(lastId), "1");
call.enqueue(new Callback<CenterModel>() {
    @Override
    public void onResponse(@NonNull Call<CenterModel> call, @NonNull Response<CenterModel> response) {
        if(response.isSuccessful()){
            if (response.body() == null || response.body().getResult() == null)  {
                return;
            }

            ArrayList<CenterModel.data> resultData = response.body().getResult();
            CenterModel.data lastData = resultData.get(resultData.size()-1);   

            if (lastData.id != null) {
                if (lastId > Integer.valueOf(lastData.id)) {     
                    lastId = Integer.valueOf(lastData.id);
                    isLoaded = false;
                    setResponseData(resultData, isNew);
                    dataList.addAll(resultData);
                }
            } else {                                               
                isLoaded = true;
            }
        }else{
            Toast.makeText(getContext(), "Error:"+String.valueOf(response.code()), Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void onFailure(@NonNull Call<CenterModel> call, @NonNull Throwable t) {      Log.e(TAG,  t.toString());
        if (t.toString().split(":")[0].equals("java.net.SocketTimeoutException")) MyUtils.wifiAlert(getContext());
    }
});

0 个答案:

没有答案