Рассчитать прогресс при выполнении функции в Android - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть функция:

 public byte[] convertFileToBytes(String path) throws IOException {

    FileInputStream fis = new FileInputStream(path);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] b = new byte[1024];

    for (int readNum; (readNum = fis.read(b)) != -1;) {
        bos.write(b, 0, readNum);
    }

    byte[] bytes = bos.toByteArray();

    return bytes;
}

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Используйте AsyncTask, OnProgressUpdate идеально подходит для этого

private class convertFileToBytes extends AsyncTask<String, Integer, byte[]> {
    FileInputStream fis = new FileInputStream(path);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] b = new byte[1024];

    int byteLength = (fis.available() / b.length) + 1);
    int increment = 0;

    @Override
    protected byte[] doInBackground(String... params) {
        for (int readNum; (readNum = fis.read(b)) != -1;) {
            bos.write(b, 0, readNum);
            ++increment;                        
            publishProgress((increment/byteLength)*100);

        }
        byte[] bytes = bos.toByteArray();
        return bytes;
    }

    @Override
    protected void onPostExecute(byte[] result) {

    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Integer... progress) {
      Log.d("progress",Integer.valueOf(progress));
     }
}
0 голосов
/ 27 ноября 2018

Вы можете просто получить доступ к прогрессу внутри цикла, например:
if (readNum%1000) cerr << readNum*100/totalNum << "% done\n";

Обратите внимание, что вам нужно будет заранее определить общий размер файла (totalNum).%1000 будет записывать только каждые 1000 операций чтения, а не каждый раз.
Обратите также внимание, что любой вывод замедляет выполнение, поэтому, информируя пользователя о прогрессе, он становится немного медленнее.

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