在Android中执行功能期间计算进度

时间:2018-11-27 15:02:00

标签: android progress-bar

我有一个功能:

 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 :(得分: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));
     }
}

答案 1 :(得分:0)

您可以简单地在循环内访问进度,例如:
if (readNum%1000) cerr << readNum*100/totalNum << "% done\n";

请注意,您必须先查找文件(totalNum)的总大小。 %1000只会每读取1000次,而不是每次写入一次。
还要注意,任何输出都会减慢执行速度,因此通过向用户通知进度,速度会变慢。