Android HTTP Multipart POST - блокирует WiFi и приводит к сбою телефона - PullRequest
1 голос
/ 22 декабря 2010

Я пытаюсь опубликовать видео файл на нашем сервере и следить за его ходом.Я выполнил шаги, описанные в Не могу получить информацию о прогрессе при загрузке файла http POST (Android) , и это сработало замечательно, но при работе с большими файлами моя программа зависает при записи в выходной сокет и впоследствии вызывает мой телефонзаблокировать WiFi, чтобы я не мог включить / выключить его, а затем вызвать его сбой (через короткий промежуток времени).

Поэтому я попытался написать свой собственный HTTPClient, и он работает, но также с переменным успехом, все еще становясь жертвой случайных сбоев метода, описанного выше.Кажется, что это происходит только на файлах> 5 МБ, но у меня он умирает около 1,3 МБ, и я даже успешно перенес файл 13 МБ.Тот факт, что он настолько случайный и спорадический, приводит в бешенство, но я убежден, что есть какая-то причина, по которой это происходит.

Вот мой код подключения:

socket.connect(new InetSocketAddress(host, port));
socket.setSendBufferSize(1024 * 65);

int bytesSent = 0;
PrintStream out = new PrintStream(socket.getOutputStream());
out.print(headersBuffer);
out.print(bodyBuffer);
bytesSent += headersBuffer.length() + headersBuffer.length();
byte[] bytes = new byte[1024 * 65];
int size;
while ((size = fileStream.read(bytes)) > 0) {
    mListener.transferred(bytesSent);
    Log.i(TAG, "bytes sent: " + bytesSent);
    bytesSent += size;
    out.write(bytes, 0, size);       // Random freezes (/blocking?) on this line
    out.flush();
}

Log.i(TAG, "Made it!");
out.print(lastBoundary);
out.flush();

Я использовал отладчик, чтобы увидеть, гдеон попадает в стек, когда кажется, что запись блокируется, и это функция OSNetworkSystem.writeSocketImpl ().Эта функция просто никогда не возвращается ...

Так что моя следующая мысль была - если сокет просто сядет, возможно, я смогу прервать его и заставить его закрыться, чтобы, по крайней мере, телефон не сломался, а пользовательможет повторить попытку ... Я прочитал о принудительном закрытии сокетов в Android здесь (поскольку кажется, что есть некоторые проблемы): http://code.google.com/p/android/issues/detail?can=2&q=7933&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&id=7933

По сути, я создал поток слушателя, который проверяет, сколько байтовпередавались каждые 500 мс, и если не было изменений, попытайтесь принудительно закрыть сокет с помощью

socket.shutdownOutput();
socket.close();

Однако сокет возвращает, что он закрыт, и все происходит сбой, как описано выше.

Вот общая последовательность событий в Logcat:

12-21 14:25:26.802  2234  2340 V UploadService: Bytes transferred: 5959800 of: 13191823
12-21 14:25:26.802  2234  2340 V UploadService: Bytes transferred: 5963896 of: 13191823
12-21 14:25:26.802  2234  2340 V UploadService: Bytes transferred: 5967992 of: 13191823
12-21 14:26:00.693  1262  1270 D WifiService: acquireWifiLockLocked: WifiLock{NetworkLocationProvider type=2 binder=android.os.Binder@45b48958}
12-21 14:26:11.083  1262  1289 D WifiHW  : 'DRIVER LINKSPEED' command timed out.
12-21 14:26:21.130  1262  1500 D WifiHW  : 'AP_SCAN 2' command timed out.
12-21 14:26:31.177  1262  1500 D WifiHW  : 'SCAN' command timed out.

И через несколько минут начинают происходить действительно плохие вещи, и телефон выходит из строя!

Пожалуйста, помогите!Спасибо.

РЕДАКТИРОВАТЬ: Отлично работает через 3G - я собираюсь попробовать дома и посмотреть, если это какая-то проблема с маршрутизатором.Однако - как я могу уловить эту проблему и предотвратить сбой телефона?

...