На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> Upload file по частям , Android Asp.net handler.
    Есть приложение asp.net. У него есть хендлер, который позволяет загружать файлы по кускам и прекрасно работает.

    Пытаюсь с андроида загрузить файлы по списку. Каждый файл должен грузиться маленькими частями.

    Примерно так:

    ExpandedWrap disabled
              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)" висьнет наглухо. Причем, этот реквест (на котором повисли) не доходит до сервера вообще.

    Ни разу не получилось до конца загрузить файл.

    Если верить отладчику, поток висит на ожидании какого-то объекта. Вот стектрейс:

    ExpandedWrap disabled
      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) удаляются быстро... все равно как-то странно, на каждый запрос клиенто своего создавать...
    Сообщение отредактировано: Felan -
      Цитата Felan @
      Может кто подскажет чего?

      Ну я пока не сталкивался с AndroidHttpClient, но могу предположить, что нужно делать close() между итерациями.
        Цитата [S]mike @
        Ну я пока не сталкивался с AndroidHttpClient, но могу предположить, что нужно делать close() между итерациями.


        Не, close() не прокатывает.
        java.lang.IllegalStateException: Connection pool shut down.

        Похоже, что все-таки надо на каждый запрос создавать клиента... :(
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0234 ]   [ 15 queries used ]   [ Generated: 3.05.24, 17:58 GMT ]