Я отчаянно пытаюсь найти решение для подключения к WiFi / GSM при загрузке файлов через HttpUrlConnection.
Я видел людей, борющихся с подобными проблемами, но все еще не мог найти рабочее решение.
Вот код:
try {
/* Opening file stream and so... */
URL url = new URL(url_to_send);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// connection.setConnectTimeout(1000); // doesn't have any effect
// connection.setReadTimeout(1000);
connection.setChunkedStreamingMode(maxBufferSize);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; charset=utf-8; boundary=" + BOUNDARY);
bytesAvailable = file_input.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = file_input.read(buffer, 0, bufferSize);
already_send += bytesRead;
while (bytesRead > 0) {
/* Updating some progressbar values */
/* HERE IS THE LINE WHERE THREAD HANGS */
output_byte.write(buffer, 0, bufferSize);
bytesAvailable = file_input.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = file_input.read(buffer, 0, bufferSize);
already_send += bytesRead;
}
output_byte.writeBytes(endBoundary);
output_byte.flush();
// Responses from the server (code and message)
serverResponseCode = connection.getResponseCode();
serverResponseMessage = connection.getResponseMessage();
} catch (FileNotFoundException e) {
Log.e(TAG, "Uploaded file not found");
e.printStackTrace();
} catch (MalformedURLException e) {
Log.e(TAG, "Malformed URL");
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "Uploading problem: " + e.toString());
e.printStackTrace();
} finally {
/* closing connection & streams */
}
Проблема в том, что всякий раз, когда я переключаюсь с WiFi на GSM или с GSM на WiFi во время цикла загрузки, поток останавливается на линии, отмеченной в коде:
output_byte.write (buffer, 0, bufferSize);
Я пытался использовать connection.disconnect () , который должен выдавать какое-то IOException (это происходит в обычных ситуациях, но не в данном конкретном случае)
Я пытался использовать OutputStream.close () , вызываемый из второго потока, но также зависает второй (основной интерфейс) поток, что не позволяет мне даже закрыть приложение.
Я искал что-то вроде connection.isAvailable () , которое я мог бы вызвать до ouptut_byte.write, но не смог найти ничего полезного в классе HttpUrlConnection.
Я пытался отслеживать состояние Wi-Fi, но поток загрузки, кажется, быстрее, чем изменение состояния Wi-Fi, и он блокируется, прежде чем я могу предоставить текущее изменение состояния Wi-Fi. (также попробовал ConnectivityManager - без разницы)
Наконец, я попытался убить поток, добавив флаг volatile в переменную Thread и используя Thread.interrupt () - безрезультатно. Нить все еще жива и находится в состоянии «РАБОТАЕТ».
У вас есть идеи, как я могу решить проблему? Я был бы очень рад, если бы я мог поймать любой тип исключения в этой теме после блоков is.