投稿日:

Android (Java) で InputStream / OutputStream の進捗状況の取得・表示


今更なネタです! (*’-‘*)

Android での開発を行っていると、頻繁に In/Out のStream を扱いますが、Stream を扱いながらプログレスバーを更新する方法を検索してみると、while 文などで自ら stream をループさせつつ、AsyncTask#publishProgress() するといった例が見つかります。

しかし、例えば BitmapFactory#decodeStream などのように、直接 Stream を扱うことが出来るメソッドも存在するため、Stream は Stream で、そのまま簡単に進捗状況をモニターしたい場面も多々あります。

本稿では、そのようなケースで利用できる別の方法を簡単にまとめてみました。

考え方としては、InputStream や OutputStream を、進捗状況をモニターする為の別の Stream でラップするだけです。具体的には、次のコードの強調部分を見てもらうと分かりやすいと思います。

ここで、「MonitorInputStream」クラスが、進捗状況を監視するための InputStream です。このクラスは、FilterInputStream を継承し、read メソッドをオーバーライドして読み込まれたデータの流量を監視し、「MonitorInputStreamListener」インターフェースを介して進捗状況を外部に送信します。

なお、MonitorInputStream 自体が MonitorInputStreamListener を implements していますので、上の例では MonitorInputStream の onStreamRead をオーバーライドしています。

MonitorInputStream クラス

MonitorInputStream クラスは下記のような実装になっています。特に難しいことはしていません。read メソッドをオーバーライドし、進捗状況を監視して、指定の MonitorInputStreamListener に進捗状況を通知します。

MonitorInputStreamListener インターフェース

進捗状態の通知を受け付けるインターフェースです。こんな感じで。

 

以上です。

全て InputStream の例で示しますが、OutputStream も同様の考え方で実現できますし、要は Stream なので汎用性も高いですので、こういうやり方も一つの方法として、是非お手元にどうぞーでございます。

 

 

 

コメントを残す