HTTPURLConnection.getInputStream () Занимает очень много времени? - PullRequest
3 голосов
/ 19 сентября 2011

Я загружаю файл изображения, используя HttpURLConnection, который занимает около 3 секунд для файла 5 МБ со всеми заголовками, но в тот момент, когда я открываю InputStream с помощью .getInputStream (), метод возвращает около 8+ секунд, чтобы вернутьпоток с.Что является проблемой, потому что кажется, что индикатор выполнения загрузки дает плохой UX, если у меня есть несколько изображений для загрузки, они имеют значительную паузу между загрузками, поэтому индикатор выполнения просто останавливается на пару секунд между загрузками.Я немного погуглил, но, похоже, ни у кого больше нет проблем с этим?

Обычно я предполагаю, что сервер работает медленно, но, поскольку загрузка занимает всего пару секунд, загрузка слова «успех»или «сбой» не должен быть такой большой проблемой!

Вот какой-то код!Я изначально что-то настраивал неправильно? Примечание: это также относится к AsyncTask

    ByteArrayInputStream fileInputStream = null;

    try {
        fileInputStream = new ByteArrayInputStream(dObject.Data);

    } catch (Exception e) {
        e.printStackTrace();
    }


    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    String Tag="3rd";
    try
    {
        //------------------ CLIENT RE QUEST        
        Log.e(Tag,"Inside second Method");      

        // Open a HTTP connection to the URL    
        URL url = new URL(_urlString);
        //connectURL is a URL object
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // Allow Inputs
        conn.setDoInput(true);

        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

        DataOutputStream dos = new DataOutputStream( conn.getOutputStream() );

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        //dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + _fileLocation +"\"" + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + _fileLocation +"\"" + lineEnd);

        dos.writeBytes(lineEnd);

        Log.e(Tag,"Headers are written");

        // create a buffer of maximum size
        int bytesAvailable = fileInputStream.available();
        int maxBufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bufferSize];



        // read file and write it into form...  
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);


        while (bytesRead > 0) {
            dos.write(buffer, 0, bufferSize);

            //int value = (int)(((float)((float)totalRead / (float) fileSize)) * 100);

            totalRead += bytesRead;
            //Publish the progress out to be displayed
            publishProgress(totalRead);



            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);


        // close streams
        Log.e(Tag,"File is written");
        fileInputStream.close();
        dos.flush();

        Log.e("TIME", "PRE GETINPUTSTREAM");
        InputStream is = conn.getInputStream(); 
        Log.e("TIME", "POST GETINPUTSTREAM");
        //  retrieve the response from server
        int ch;


        //Build the respose and log
        StringBuilder b =new StringBuilder();
        while( ( ch = is.read() ) != -1 ){
            b.append( (char)ch );
        }
        String s=b.toString();      
        Log.i("Response",s);
        dos.close();

        return;
    }
    catch (MalformedURLException ex)
    {
        ErrorHandler.get().e("3");
    }

    catch (IOException ioe)
    {
        ErrorHandler.get().e("2");
    }

Ответы [ 2 ]

4 голосов
/ 19 сентября 2011

Обычно я предполагаю, что сервер работает медленно, но, поскольку загрузка занимает всего пару секунд, загрузка слова «success» или «fail» не должна быть такой большой проблемой!

Я подозреваю, что на самом деле сервер работает медленно или перегружен.

  • Сервер может ставить в очередь запросы HTTP и обрабатывать одновременно только небольшое число одновременно.

  • Или это может быть узким местом в какой-либо операции с базой данных, которая выполняется до того, как ответ, содержащий файл, записывается в ответ.

  • Илиэто может быть генерация файла на лету в буфере в памяти (медленный), а затем потоковая передача (быстрый) из буфера в ответ HTTP.

  • Или другие подобные объяснения...

(Теоретически возможно, что происходит что-то смешное, что замедляет доставку запроса на сервер. Хотя я думаю, что это маловероятно.)


Вы пытались загрузить тот же файл с помощью веб-браузера?У вас там такое же поведение?

0 голосов
/ 31 марта 2016

В моем случае я обнаружил, что getInputStream выглядит медленно, потому что этот метод инициализирует рукопожатие ssl (при вызове URL https)После первого звонка другие звонки в порядке

...