Android/Java:如何跟踪InputStream的进度 [英] Android/Java: How to track progress of InputStream

查看:138
本文介绍了Android/Java:如何跟踪InputStream的进度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的Android应用程序中包含以下代码,不确定是否是我的谷歌搜索技能,但无法找到有关如何监控InputStream进度的良好教程.

I have the following code in my Android app, and not sure whether it is my Googling skills, but am not able to find a good tutorial on how to monitor progress of InputStream.

private void restoreFromUri(Uri uri) {
    try {
        InputStream is = getContentResolver().openInputStream(uri);
        ObjectInputStream ois = new ObjectInputStream(is);
        ArrayList<String> myList = (ArrayList) ois.readObject();
        ois.close();
        is.close();
    } catch (Exception e) {
        Snackbar.make(snackView, e.getMessage(), Snackbar.LENGTH_LONG).show();
    }
}

上面的代码很好用,但是在内容来自GMail的情况下,即使是一个小文件也要花费几秒钟的时间来读取和填充ArrayList.

The above code works well, but in scenarios where the content is coming from GMail, even a small file takes a few seconds to read and populate the ArrayList.

是否可以显示进度条以及读取的文件/内容的百分比?

Is it possible to show a progress bar with the percentage of file/content read?

推荐答案

如果我正确理解,该方法是创建一个装饰器inputstream并重写某些方法,该方法会念诵readstream方法或skip方法之类的输入流状态.然后使用观察者模式通知moinotr读取的百分比.请参见以下代码:

If i understand correctly,the approach is create a decorator inputstream and override some method which will chante the inputstream state like read method or skip method.And then use observer pattern notify the moinotr the percent of read.See the following code:

    public static class ProcessInputStream extends InputStream{

    private InputStream in;
    private int length,sumRead;
    private java.util.List<Listener> listeners;
    private double percent;

    public ProcessInputStream(InputStream inputStream,int length) throws IOException{
        this.in=inputStream;
        listeners=new ArrayList<>();
        sumRead=0;
        this.length=length;
    }


    @Override
    public int read(byte[] b) throws IOException {
        int readCount = in.read(b);
        evaluatePercent(readCount);
        return readCount;
    }



    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int readCount = in.read(b, off, len);
        evaluatePercent(readCount);
        return readCount;
    }

    @Override
    public long skip(long n) throws IOException {
        long skip = in.skip(n);
        evaluatePercent(skip);
        return skip;
    }

    @Override
    public int read() throws IOException {
        int read = in.read();
        if(read!=-1){
            evaluatePercent(1);
        }
        return read;
    }

    public ProcessInputStream addListener(Listener listener){
        this.listeners.add(listener);
        return this;
    }

    private void evaluatePercent(long readCount){
        if(readCount!=-1){
            sumRead+=readCount;
            percent=sumRead*1.0/length;
        }
        notifyListener();
    }

    private void notifyListener(){
        for (Listener listener : listeners) {
            listener.process(percent);
        }
    }
}

Listener类是一个回调,当有人更改输入流的索引(例如读取字节或跳过字节)时,将调用该回调.

The Listener class is a callback which will be invoked when someone change the index of inputstream like read bytes or skip bytes.

public interface Listener{
    void process(double percent);
}

测试用例代码:

    UserInfo userInfo=new UserInfo();
    userInfo.setName("zyr");
    userInfo.setPassword("123");
    userInfo.setTestString(new ArrayList<>());
    System.out.println(userInfo);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos=new ObjectOutputStream(bos);
    oos.writeObject(userInfo);
    byte[] objectBytes = bos.toByteArray();
    oos.close();
    bos.close();


    ProcessInputStream processInputStream = new ProcessInputStream(new ByteArrayInputStream(objectBytes),objectBytes.length);


    processInputStream.addListener(percent -> System.out.println(percent));
    ObjectInputStream ois=new ObjectInputStream(processInputStream);


    UserInfo target = (UserInfo) ois.readObject();
    System.out.println(target);

在上面的代码中,我只打印读取字节的百分比,根据您的要求,您应该更改进程栏的位置.

In the above code,i just print the percent of read bytes,with your requirement,you should change the position of the process bar.

这是输出的一部分;

UserInfo{id=0, name='zyr', password='123', testString=[]}
0.008658008658008658
0.017316017316017316
0.021645021645021644
......
......
0.9523809523809523
0.9696969696969697
0.974025974025974
0.9783549783549783
0.9956709956709957
1.0
UserInfo{id=0, name='zyr', password='123', testString=[]}

这篇关于Android/Java:如何跟踪InputStream的进度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆