Enough or not - depends on what the service gives. If it is public data, it makes no sense to close them. If private, you can use the secret key, as most web services do.
It is sent in the same ways as in any other java-program. And as in any other java-program (excluding, perhaps, console utilities) it is worth doing it in the background thread. In Android, there is AsyncTask and Handler for this. The choice of one of them depends on the features of your program. An example of using AsyncTask:
private class GetJsonTask extends AsyncTask<URL, String, JSONObject> { @Override protected JSONObject doInBackground(URL... urls) { //Фоновый поток HttpURLConnection connection = (HttpURLConnection)urls[0].openConnection(); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = connection.getInputStream(); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { throw new IOException(connection.getResponseMessage()); } int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = in.read(buffer)) > 0) { out.write(buffer, 0, bytesRead); } out.close(); return new JSONObject(out.toString()); } finally { connection.disconnect(); } } @Override protected void onPostExecute(JSONObject json) { //Callback в главном потоке //Делайте с вашим json всё, что нужно. } } new GetJsonTask().execute(new URL('http://myservice.ru/somedata.json'));