I have an asynchronous method that allows downloading files. If the middle of the download, I will remove the connection (wifi or 3g) timeout never occurs.
Always stay in the next loop waiting to return the connection:
while ((count = input.read(data)) != -1) {
        System.out.println("state 5");
        total += count;
        publishProgress((int) (total * 100 / fileLength));
        output.write(data, 0, count);
}
I do:
  private class DownloaderFile extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... params) {
            ...
            try{
                URLConnection connection = urlFinal.openConnection();
                connection.setConnectTimeout(TIMEOUT_VALUE);
                connection.setReadTimeout(TIMEOUT_VALUE);
                connection.connect();
                int fileLength = connection.getContentLength();
                InputStream input = new BufferedInputStream(urlFinal.openStream());
                OutputStream output = new FileOutputStream(folder + params[0]);
                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
//always wait here
                    System.out.println("state 5");
                    total += count;
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }
                output.flush();
                output.close();
                input.close();
            } catch (SocketTimeoutException e) {
                System.out.println("TIMEOUT!!! " + TIMEOUT_VALUE + " elapsed.");
                callback.onDownloadEnd(DOWNLOAD_ERROR);
            }
            ...
        }
        ...
 
     
     
    