Как я могу правильно установить значение прогресса?

Я много раз искал в google и stackoverflow, но не могу найти то, что мне нужно. Я написал код, который загружает файл на сервер с помощью асинхронного метода. Что я сделал: в методе asyntask я загружаю свой файл методом post в свой веб-сервис. в методе doInBackground:

int serverResponseCode = 0;
try {

    // open a URL connection to the Servlet
    FileInputStream fileInputStream = new FileInputStream(sourceFile);

    // ------------------ CLIENT REQUEST
    URL url = new URL(upLoadServerUri);

    // Open a HTTP connection to the URL
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true); // Allow Inputs
    conn.setDoOutput(true); // Allow Outputs
    conn.setUseCaches(false); // Don't use a Cached Copy

    // Use a post method.
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Connection", "Keep-Alive");

    conn.setRequestProperty("ENCTYPE", "multipart/form-data");
    conn.setRequestProperty("Content-Type",
        "multipart/form-data;boundary=" + boundary);
    conn.setRequestProperty("file_name", fileName);
    conn.setRequestProperty("file_name_audio", fileName); 
    // conn.setFixedLengthStreamingMode(1024);
    // conn.setChunkedStreamingMode(1);

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

    dos.writeBytes(twoHyphens + boundary + lineEnd);

    dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
        + fileName + "\"" + lineEnd);

    dos.writeBytes(lineEnd);


        // create a buffer of maximum size
    bytesAvailable = fileInputStream.available();

    int streamSize = (int) sourceFile.length();
    bufferSize = streamSize / 4;

    buffer = new byte[streamSize];
    int sentBytes=0;
    // read file and write it into form...
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    while (bytesRead > 0) {  
    Thread.sleep(2);  
    sentBytes += bufferSize;
    int progress = (int)((sentBytes / (float) bytesAvailable) * 100);
    publishProgress( progress+""); 
    dos.write(buffer, 0, bufferSize);
    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);

    // Responses from the server (code and message)
    serverResponseCode = conn.getResponseCode();
    @SuppressWarnings("unused")
    String serverResponseMessage = conn.getResponseMessage();

    fileInputStream.close();  
    dos.flush();
    dos.close();
    
} catch (MalformedURLException ex) {
    ex.printStackTrace();
     Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
    e.printStackTrace();
}

String serverResponseMessage = conn.getResponseMessage(); это намного больше времени

мой процесс загрузки устанавливается 4 раза, а затем я жду больше времени, чтобы действительно загрузить свой файл на сервер. Почему мне нужно, если код выходит из while. Как я могу установить значение индикатора выполнения более чувствительным, и когда значение progressbar установлено на 100, я хочу файл загрузка действительно завершена. Я установил методы onpreexecute и onpostexecute. Но я думаю, что они не должны писать здесь. И я использую notificationbar прогресс, поэтому я должен показывать процент.


person Ersin Gülbahar    schedule 27.03.2014    source источник
comment
когда курсор выходит, пока я все еще жду загрузки файла   -  person Ersin Gülbahar    schedule 28.03.2014


Ответы (2)


В AsynTask есть несколько методов, которые вы можете переопределить, и один из них следующий:

void onPreExecute()
{
   //here you can show your progress bar
}

Затем есть другой метод, который вызывается, когда вы выполняете задачу:

void onPostExecute(String result)
{
    //here you can dismiss your progressbar
}

Теперь, насколько я знаю, вы можете использовать различные виды баров, чтобы показать свой прогресс; от упрощенных, которые показывают круг, до горизонтальных с разными уровнями завершения.

Если вы покажете округленное, вам не нужно будет показывать проценты, но если вы выберете горизонтальное, вам придется сделать некоторые расчеты и установить его соответствующим образом!

Помните, что вы можете обновлять полосу прогресса из doInBackground в зависимости от того, сколько работы осталось!

Надеюсь, это поможет!

person Eenvincible    schedule 27.03.2014
comment
Я установил методы onpreexute и onpostexecute. Я хочу горизонтального прогресса, и мне нужно показать процент, - person Ersin Gülbahar; 28.03.2014
comment
Смотрите мой обновленный ответ, где я упоминаю об обновлении индикатора выполнения из метода doinbackground. - person Eenvincible; 28.03.2014
comment
Я уже установил значение прогресса для работы в фоновом режиме. Вы читали мой вопрос? - person Ersin Gülbahar; 28.03.2014

Это шаги, которые я реализовал в одном из своих проектов, этот сценарий может помочь или не помочь в вашей ситуации.

  • Создайте исполняемый поток, который загружает файл. Этот класс содержит метод get, и мы используем этот метод для вычисления значения индикатора выполнения.
  • Метод get содержит логику (например, получить размер файла и указать, как вы загрузили данные, из этих значений вы получите процентиль, который вы можете использовать для индикатора выполнения).
  • Создайте таймер, который устанавливает значение индикатора выполнения.
  • Запустите таймер непосредственно перед началом процесса
  • Поток таймера, который устанавливает значение индикатора выполнения и загружает поток загрузки и предоставляет значение индикатора выполнения.

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

Спасибо

person Anil Kumar Mangali    schedule 27.03.2014
comment
спасибо за ответ, я согласен с вами, я пытаюсь сделать это, но где-то есть проблема, пожалуйста, посмотрите мой код - person Ersin Gülbahar; 28.03.2014