(Android) Получить ход загрузки из Socket Outputstream.write()?

Я делаю приложение для Android для передачи файлов с устройства в приложение Java на компьютере. Он работает в том смысле, что может отправлять файлы на компьютер, но при отправке имеет ProgressDialog. Это диалоговое окно не предназначено для наблюдения за ходом чтения с SD-карты, а вместо этого за ходом загрузки на сервер. Пока что мои поиски привели только к чтению с SD-карты или веб-страницы.

Для загрузки я использую простой OutputStream, созданный с помощью socket.getOutputStream();. Мой код выглядит следующим образом:

protected void onProgressUpdate(Integer... values) {
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setProgress(progress);
}

@Override
protected String doInBackground(String[] params) {
    String IP = params[1];
    File myFile = new File(params[0]);
    int count;
    try {
        long total = 0;
        Socket socket = new Socket(IP, 25000);
        byte[] buffer = new byte[(int) myFile.length()];
        FileInputStream fis = new FileInputStream(myFile);
        BufferedInputStream in = new BufferedInputStream(fis);
        OutputStream out = socket.getOutputStream(); // THIS IS MY OUTPUTSTREAM
        while((count = in.read(buffer, 0, buffer.length)) != -1) {
            total += count;
            progress = (int) (count);
            publishProgress();
            out.write(buffer, 0, buffer.length);
            Log.i("TOTAL", Long.toString(total));
            Log.i("Upload progress", "" + (int) ((total * 100) / buffer.length));
        }
        out.flush();
        out.close();
        in.close();
        socket.close();
    } catch(Exception ex) {
        ex.printStackTrace();
        Log.i("TAG", "Failed to send file");
    }
    return "test";
}

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

На данный момент диалоговое окно прогресса мгновенно переходит от 0 к максимальному, независимо от размера файла (на самом деле это занимает гораздо больше времени). Я не знаю, что может быть причиной этого, но это не главное.

Как я могу отслеживать ход загрузки файла с помощью OutputStream? Возможно ли это сделать?

Заранее спасибо.


person Josh Alan    schedule 27.07.2017    source источник


Ответы (1)


Ваша проблема в том, что вы создали буфер с вашим размером файла:

byte[] buffer = new byte[(int) myFile.length()];

Таким образом, вы проходите цикл только 1 раз, потому что достаточно места для данных.

while((count = in.read(buffer, 0, buffer.length)) != -1)

Вам нужно изменить что-то вроде этого:

byte[] buffer = new byte[256];
person Aleksandr    schedule 27.07.2017