Подсчитайте прогресс во время выполнения функции в Android

голоса
0

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

 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;
}

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

Задан 27/11/2018 в 15:01
источник пользователем
На других языках...                            


2 ответов

голоса
1

Использование 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));
     }
}
Ответил 27/11/2018 в 15:16
источник пользователем

голоса
0

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

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

Ответил 27/11/2018 в 15:09
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more