ここに私がやっているいくつかの簡単なコードがあります。(読みやすくするために一部を削除しました。) 基本的に、ファイルを開き、一度に 3k のチャンクを処理しています。これらは Base64 (現在は 4k チャンク) にエンコードされ、HTTP ポスト経由でアップロードされます。DataOutputStream.writeBytes() を呼び出すたびに、DataOutputStream.flush() も呼び出し、送信された量に基づいて進行状況バーを更新します。
File myImage = new File(somepath);
int bytesAvailable = myImage.length();
while (bytesAvailable > 0)
{
byte[] buffer = new byte[Math.min(12288, (int)bytesAvailable)];
bytesRead = fileInputStream.read(buffer, 0, Math.min(12288, (int)bytesAvailable));
if (bytesRead > 0)
{
s2 = Base64.encodeBytes(buffer);
bytesAvailable = fileInputStream.available();
dataStream.writeBytes(s2);
dataStream.flush();
// UPDATE THE PROGRESS BAR HERE
}
}
これで、アプリケーションを実行すると、毎回画像が正常にアップロードされます。ただし、モバイル接続インジケーター (上/下矢印) を見ると、プログレス バーが移動している間は点灯しません。3MB の画像の場合、バーは 10 秒ほどで 0 から 100% に変化します (私の 3G 電話では速すぎます)。次に 100% で、このループが完了した後、dataStream.close() メソッドが呼び出されます。これは、データ送信が開始されるときです (矢印で示されているように)。これは、終了する前に数分間座っています。
flush() を正しく理解していませんか? データの送信を強制するべきではありませんか?