0

Я пытаюсь загрузить на сервер некоторые пользовательские данные ввода, текст и изображение (преобразованное в строку base64). Я использую httpurlconnection, чтобы выполнить это, но производительность очень медленная. Размер изображения составляет 600 X 600, а для его загрузки требуется около 119-125 секунд, что немаловажно. Вот мой код -Медленная производительность загрузки данных с использованием Httpurlconnection в android

public class MyClass implements Runnable { 
Thread thread = new Thread(this); 
    public MyClass(String url_string.......) { 
    thread.start(); 
    } 

    @Override 
    public void run() 
    { 
     String response = executeRequest(); 
     parseResponse(response); 
    } 
} 

      URL url_string = prepareURL(url_string, method); 
      url = new URL(url_string); 
      httpUrlConnection = (HttpURLConnection) url.openConnection(); 
      httpUrlConnection.setRequestProperty("Connection", "Keep-Alive"); 
      httpUrlConnection.setConnectTimeout(25000); 
      httpUrlConnection.setUseCaches(false); 
      httpUrlConnection.setRequestMethod(method); 
    //method variable in the above line is just a string constant (GET or POST) 

      if(method.equalsIgnoreCase(Constants.POST)) { 
       httpUrlConnection.setDoInput(true); 
       httpUrlConnection.setDoOutput(true); 
      } 

      //toUseJson variable is us just a boolean to determine whether 
      //we have to set the chunking or fixedstreaming mode, 
      //based on GET method or POST method 

      if(toUseJson) { 
       //httpUrlConnection.setFixedLengthStreamingMode(json_message.getBytes().length); 
       //httpUrlConnection.setChunkedStreamingMode(1024*8); 
       httpUrlConnection.setChunkedStreamingMode(0); 
      } 

      httpUrlConnection.connect(); 

      System.out.println("start - " + System.currentTimeMillis()); 
      if(toUseJson) { 
       output_stream = httpUrlConnection.getOutputStream(); 
       BufferedOutputStream buffered_output_stream = new BufferedOutputStream(output_stream); 
       System.out.println("the bytes to read - " + json_message.getBytes().length); 
       InputStream is = new ByteArrayInputStream(json_message.getBytes("UTF-8")); 
       byte[] buffer = new byte[1024*1024]; 
       int count = 0; 

       System.out.println("middle - " + System.currentTimeMillis()); 
       while((count = is.read(buffer)) != -1) { 
        System.out.println("count - " + count); 
        buffered_output_stream.write(buffer, 0, count); 
       } 

       output_stream.flush(); 
      } 

........

Я пытаюсь различные комбинации, чтобы сбить время загрузки, но это всегда занимает около 110-120 секунд. Число байтов, которое имеет сообщение json - 907237 bytes

Любая помощь будет оценена. Спасибо!

+0

Рассматривали ли вы делать загрузку асинхронной? – BlackHatSamurai

+0

Это происходит на эмуляторе или на самом устройстве? –

+0

@Blaine: да, это делается по отдельной теме. – SimplyJaymin

ответ

0

Попробуйте поместить свой размер буфера в 1024 вместо 1024 * 1024.

1024B - 1 КБ, поэтому скопируйте его 1 КБ за раз.

Вы были выделить 1024 * 1024, который 1024KB = 1MB который разве так грациозно андроид;)

+0

Попробуй сейчас и сообщишь, сколько времени прошло. Спасибо за ваш вход – SimplyJaymin

+0

Слишком медленно, я проверил онлайн-документацию Android, и он говорит, что если я использую - 'OutputStream output_stream = new BufferedOutputStream (httpUrlConnection.getOutputStream());' и просто делает 'output_stream.write (bytes) ; 'тогда внутренняя реализация write() имеет размер буфера 8kb. – SimplyJaymin

+0

попробовал 16 КБ в качестве размера буфера. по-прежнему занимает почти одно и то же время. Просто не имеет смысла. – SimplyJaymin