У меня нет кода передо мной, но я похож на проект несколько лет назад.
Я написал подкласс InputStream
, обернутый вокруг объекта InputStream
, который я получил от openInputStream()
, переопределив все методы read()
, чтобы они увеличивали счетчик на количество прочитанных байтов. Всякий раз, когда счетчик достигает определенного порога, он обновляет объект GaugeField
, который был передан в конструктор подкласса.
Итак, ваш подкласс будет выглядеть примерно так:
public GaugedInputStream extends InputStream
{
private InputStream _inputStream = null;
private GaugeField _gaugeField = null;
private int _counter = 0;
private int _threshold = 0;
public void GaugedInputStream(InputStream inputStream, GaugeField gaugeField)
{
_inputStream = inputStream;
_gaugeField = gaugeField;
... other constructor stuff ...
}
public int read()
{
int byte = _inputStream.read();
increment(1);
return byte;
}
public int read(byte[] b)
{
int bytes = _inputStream.read(b);
increment(bytes);
return bytes;
}
public int read(byte[] b, int off, int len)
{
int bytes = _inputStream.read(b, off, len);
increment(bytes);
return bytes;
}
... override other InputStream methods here ...
private void increment(int bytes)
{
_counter = _counter + bytes;
_threshold = _threshold + bytes;
updateGaugeIfNeeded();
}
private void updateGaugeIfNeeded()
{
if (_threshold > 100)
{
updateGauge();
_threshold = 0;
}
}
private void updateGauge()
{
... code to update the gauge ...
}
}
Я оставляю здесь много смелости, но я надеюсь, что это направит вас в правильном направлении.