如何在获得响应后关闭http客户端连接?

时间:2018-01-19 10:31:55

标签: android http httpclient okhttp

我正在使用http客户端发送请求。我希望确保在收到回复后关闭连接。

代码:

public class WebserviceCall extends AsyncTask<Void,Void,String> {
    // interface for response
    AsyncResponse delegate;
    private final MediaType URLENCODE = MediaType.parse("application/json;charset=utf-8");
    ProgressDialog dialog;
    Context context;
    String dialogMessage;
    boolean showDialog = true;
    String URL;
    String jsonBody;
    private OkHttpClient client;

    public WebserviceCall(Context context, String URL, String jsonRequestBody, String dialogMessage, boolean showDialog, AsyncResponse delegate){
        this.context = context;
        this.URL = URL;
        this.jsonBody = jsonRequestBody;
        this.dialogMessage = dialogMessage;
        this.showDialog = showDialog;
        this.delegate = delegate;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if(Utils.isNetworkAvailable(context)) {
            if (showDialog) {
                /*dialog = new ProgressDialog(context);
                dialog.setMessage(dialogMessage);
                dialog.show();*/
            }
        } else {
            Utils.showDialog(context, context.getString(R.string.networkWarning));
        }
    }

    @Override
    protected String doInBackground(Void... params) {
        // creating okhttp client
        client = new OkHttpClient();

        // client.setConnectTimeout(10L, TimeUnit.SECONDS);
        // creating request body
        RequestBody body;
        if(jsonBody != null) {
            body = RequestBody.create(URLENCODE, jsonBody);
        }else{
            body = null;
        };

        // creating request
        Request request = new Request.Builder()
            .post(body)
            .url(URL)
            .build();
        // creating webserivce call and get response
        try {
            Response response = client.newCall(request).execute();
            String res = response.body().string();
            Log.d("myapp", res);
            return res;
        } catch (IOException e) {
            e.printStackTrace();
            // Toast.makeText(context,"could not connect to server",Toast.LENGTH_LONG).show();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
        /*if ((dialog != null) && showDialog) {
            dialog.dismiss();
        }*/
        } catch (final IllegalArgumentException e) {
            // Handle or log or ignore
        } catch (final Exception e) {
            // Handle or log or ignore
        } finally {
            dialog = null;
        }

        if (s != null) {
            delegate.onCallback(s);
        } else {
            Log.d("myapp",getClass().getSimpleName()+": response null");
        }
    }
}

以下是请求网址的代码。收到回复后如何关闭此连接?

我在客户端对象上搜索了disconnect或close方法,但是没有这样的方法。

有人可以帮帮忙吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

“调用response.body()。close()将释放响应所持有的所有资源。连接池将保持连接打开,但如果它未使用,它将在超时后自动关闭。” Answered here.

答案 1 :(得分:0)

如果线程和连接保持空闲,它们将自动释放。但是,如果您正在编写需要积极发布未使用资源的应用程序,则可以这样做。

使用shutdown()关闭调度程序的执行程序服务。这也将导致未来对客户的呼叫被拒绝。

 client.dispatcher().executorService().shutdown();

使用evictAll()清除连接池。请注意,连接池的守护程序线程可能不会立即退出。

 client.connectionPool().evictAll();

如果您的客户端有缓存,请调用close()。请注意,对已关闭的缓存创建调用是错误的,这样做会导致调用崩溃。

 client.cache().close();

您可以在以下链接中获得更多详细信息 https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html