gpt4 book ai didi

java - 安卓/Java : How to track progress of InputStream

转载 作者:行者123 更新时间:2023-11-29 19:10:34 24 4
gpt4 key购买 nike

我的 Android 应用程序中有以下代码,不确定这是否是我的谷歌搜索技能,但我找不到关于如何监控 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。

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

最佳答案

如果我理解正确,该方法是创建一个装饰器输入流并覆盖一些方法,该方法将像读取方法或跳过方法一样吟唱输入流状态。然后使用观察者模式通知 moinotr 读取的百分比。请参见以下代码:

    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 类是一个回调,当有人更改输入流的索引(如读取字节或跳过字节)时将调用该回调。

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

上面的代码中,我只是打印了读取字节的百分比,根据你的要求,你应该改变进程条的位置。

这是输出的一部分;

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=[]}

关于java - 安卓/Java : How to track progress of InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com