Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.80.213] |
|
Сообщ.
#1
,
|
|
|
Есть приложение asp.net. У него есть хендлер, который позволяет загружать файлы по кускам и прекрасно работает.
Пытаюсь с андроида загрузить файлы по списку. Каждый файл должен грузиться маленькими частями. Примерно так: AndroidHttpClient httpClient = AndroidHttpClient.newInstance("AndroidData.ashx"); String urlHandler = _cachedService.getBaseUrl() + "/Forms/AndroidData.ashx"; //Перебираем файлы for (int i = 0; i < filesToUpload.size(); ++i) { FileInfo fileInfo = filesToUpload.get(i); InputStream fileStream = manager.getFileInputStream(context, fileInfo.getId()); long fileSize = 0; try { fileSize = fileStream.available(); } catch(Exception e) {} long fileSizeUploaded = 0; long uploadedPercent = fileSize == 0 ? 0 : (100 * fileSizeUploaded) / fileSize; listener.statusChanged("Uploading file " + (i + 1) + " of " + filesToUpload.size() + "\u2026\r\n" + fileInfo.getName() + " [" + uploadedPercent + "%]" , "Processing form\u2026", false, false); Log.v("Synchronizer", "Started uploading file \"" + (i + 1) + "\" of \"" + filesToUpload.size() + "\". \"" + fileInfo + "\"."); String fileId = null; ////////Start List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("operation", "StartUploadFile")); nameValuePairs.add(new BasicNameValuePair("sessionId", _cachedService.getSessionId())); String url = urlHandler + "?" + URLEncodedUtils.format(nameValuePairs, "UTF-8"); HttpPost request = new HttpPost(url); try { ResponseHandler<String> responseHandler = new BasicResponseHandler(); fileId = httpClient.execute(request, responseHandler); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ////////UploadPart byte[] buff = new byte[1024 * 100]; while(fileSizeUploaded < fileSize){ nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("operation", "UploadFilePart")); nameValuePairs.add(new BasicNameValuePair("sessionId", _cachedService.getSessionId())); nameValuePairs.add(new BasicNameValuePair("fileId", fileId)); try { int readed = fileStream.read(buff); ByteArrayInputStream bais = new ByteArrayInputStream(buff, 0, readed); InputStreamEntity ise = new InputStreamEntity(bais, bais.available()); url = urlHandler + "?" + URLEncodedUtils.format(nameValuePairs, "UTF-8"); request = new HttpPost(url); request.setEntity(ise); HttpResponse responce = httpClient.execute(request); fileSizeUploaded += readed; uploadedPercent = fileSize == 0 ? 0 : (100 * fileSizeUploaded) / fileSize; listener.statusChanged("Uploading file " + (i + 1) + " of " + filesToUpload.size() + "\u2026\r\n" + fileInfo.getName() + " [" + uploadedPercent + "%]" , "Processing form\u2026", false, false); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } *** Все это происходит в отдельном потоке, т.е. AsyncTask'е. Запросы выполняеются, даже че-то вроде грузится... Но! Примерно на третьей итерации цикла в части ////////UploadPart, клиент при выполнении строки " httpClient.execute(request)" висьнет наглухо. Причем, этот реквест (на котором повисли) не доходит до сервера вообще. Ни разу не получилось до конца загрузить файл. Если верить отладчику, поток висит на ожидании какого-то объекта. Вот стектрейс: Thread [<9> AsyncTask #1] (Suspended) Object.wait(long, int) line: not available [native method] Thread.parkFor(long) line: 1424 LangAccessImpl.parkFor(long) line: 48 Unsafe.park(boolean, long) line: 337 LockSupport.park(Object) line: 157 AbstractQueuedSynchronizer$ConditionObject.await() line: 2016 WaitingThread.await(Date) line: 159 ConnPoolByRoute.getEntryBlocking(HttpRoute, Object, long, TimeUnit, WaitingThreadAborter) line: 339 ConnPoolByRoute$1.getPoolEntry(long, TimeUnit) line: 238 ThreadSafeClientConnManager$1.getConnection(long, TimeUnit) line: 175 DefaultRequestDirector.execute(HttpHost, HttpRequest, HttpContext) line: 325 AndroidHttpClient$2(AbstractHttpClient).execute(HttpHost, HttpRequest, HttpContext) line: 555 AndroidHttpClient$2(AbstractHttpClient).execute(HttpUriRequest, HttpContext) line: 487 AndroidHttpClient$2(AbstractHttpClient).execute(HttpUriRequest) line: 465 AndroidHttpClient.execute(HttpUriRequest) line: 243 Synchronizer.uploadFileByParts(Context, ChangeStatusListener, FileManager, SaveFormDataResult, List) line: 724 Synchronizer.syncFormData(Context, int, ChangeStatusListener) line: 585 Synchronizer.access$6(Context, int, ChangeStatusListener) line: 545 Synchronizer$3.run(String...) line: 434 Synchronizer$3.run(Object...) line: 1 WorkableTask.doInBackground(Object...) line: 39 AsyncTask$2.call() line: 185 FutureTask$Sync.innerRun() line: 306 AsyncTask$3(FutureTask).run() line: 138 ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1088 ThreadPoolExecutor$Worker.run() line: 581 Thread.run() line: 1019 Че-то ума не приложу, чего ему может не нравиться... Может кто подскажет чего? ЗЫЖ Исходники как научено тут подключены, но похоже что как-то не очень. При клике на стектрейсе курсор по большей части попадает на комментарии... ЗЫЫЖ Появляется какой-то поток Deamon Thread, который в строке отладчика содержит такие загадочные слова как RefQueueWorker@org.apache.http.impl.conn.tsccm.ConnPoolByRoute... Дедлог с ним... Как лечить не понятно пока... ЗЫЫЖ Вобщем-то пересоздание AndroidHttpClient каждый раз проблему решило... Но разве это правильно? В принципе даже потоки дополнительные (Daemon Thread) удаляются быстро... все равно как-то странно, на каждый запрос клиенто своего создавать... |
Сообщ.
#2
,
|
|
|
Цитата Felan @ Может кто подскажет чего? Ну я пока не сталкивался с AndroidHttpClient, но могу предположить, что нужно делать close() между итерациями. |
Сообщ.
#3
,
|
|
|
Цитата [S]mike @ Ну я пока не сталкивался с AndroidHttpClient, но могу предположить, что нужно делать close() между итерациями. Не, close() не прокатывает. java.lang.IllegalStateException: Connection pool shut down. Похоже, что все-таки надо на каждый запрос создавать клиента... |