Загрузить индикатор выполнения в Android? - PullRequest
10 голосов
/ 24 февраля 2011

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

      HttpURLConnection conn = null;
      DataOutputStream dos = null;
      DataInputStream inStream = null;
      String lineEnd = "\r\n";
      String twoHyphens = "--";
      String boundary = "*****";
      int bytesRead, bytesAvailable, bufferSize;
      byte[] buffer;
      int maxBufferSize = 1 * 1024 * 1024;
      String responseFromServer = "";

      File sourceFile = new File(sourceFileUri);
      if (!sourceFile.isFile()) {
       Log.e("Huzza", "Source File Does not exist");
       return;
      }
      int serverResponseCode=0;
    try { // open a URL connection to the Servlet
       FileInputStream fileInputStream = new FileInputStream(sourceFile);
       URL url = new URL(upLoadServerUri);
       conn = (HttpURLConnection) url.openConnection(); // Open a HTTP  connection to  the URL
       conn.setDoInput(true); // Allow Inputs
       conn.setDoOutput(true); // Allow Outputs
       conn.setUseCaches(false); // Don't use a Cached Copy
       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("uploadedfile", fileName);

      // conn.setFixedLengthStreamingMode(1024);
       //conn.setChunkedStreamingMode(1);
       dos = new DataOutputStream(conn.getOutputStream());

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

       bytesAvailable = fileInputStream.available(); // create a buffer of  maximum size
       Log.i("Huzza", "Initial .available : " + bytesAvailable);

       //bufferSize = Math.min(bytesAvailable, maxBufferSize);
       bufferSize=(int)sourceFile.length();


       System.out.println("BytesAvail"+bytesAvailable);
       System.out.println("maxBufferSize"+maxBufferSize);
       buffer = new byte[bufferSize];

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

       while (bytesRead > 0) {
        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();
       String serverResponseMessage = conn.getResponseMessage();

       Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
       // close streams
       Log.i("Upload file to server", fileName + " File is written");
       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();
      }
    //this block will give the response of upload link
      try {
       BufferedReader rd = new BufferedReader(new InputStreamReader(conn
         .getInputStream()));
       String line;
       while ((line = rd.readLine()) != null) {
        Log.i("Huzza", "RES Message: " + line);
       }
       rd.close();
      } catch (IOException ioex) {
       Log.e("Huzza", "error: " + ioex.getMessage(), ioex);
      }
      return;  // like 200 (Ok) 

Спасибо.

Ответы [ 4 ]

7 голосов
/ 24 февраля 2011

Введите код загрузки в методе doInBackGround из AsyncTask.Затем вы можете publishProgress оттуда и в onProgressUpdate обновить ProgressBar.

Посмотрите здесь , как это может выглядеть с publishProgress.

1 голос
/ 24 февраля 2011

Я думаю, что вы спрашиваете, как вы можете получить числовое представление текущего прогресса загрузки, чтобы вы могли показать это значение в виде индикатора выполнения. С вашим текущим кодом, я не уверен, что вы легко можете. Какой самый большой файл вы пытались загрузить? Я думаю, вы получите ошибку OutOfMemory с большими файлами. Вы делаете это:

byte[] buffer;
bufferSize=(int)sourceFile.length();
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
...

Ваш "буфер" - это просто массив такого же размера, как и весь ваш файл. Вызов fileInputStream.read() может попытаться поместить все содержимое файла в «буфер». Если ваш файл большой (более нескольких десятков мегабайт), то ваше приложение может аварийно завершить работу с ошибкой OutOfMemory.

Если вы используете небольшой буфер фиксированного размера, то каждый раз в цикле while вы можете вычислить объем уже отправленных данных, преобразовать его в процентное значение и либо вызвать publishProgess для 1011 * или sendMessage для Handler.

0 голосов
/ 07 мая 2014
connection.setFixedLengthStreamingMode((int) requestLength);

сделал трюк для меня!

0 голосов
/ 24 февраля 2011

Или вы можете использовать Thread с обработчиком, если вы хотите более детальный контроль, хотя для большинства задач AFAIK AsyncTask должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...