imap プロトコルで JavaMail を使用して Gmail アカウントにアクセスし、添付の BodyPart から InputStream を取得しています。問題は、ファイルのダウンロードを開始したときに、ダウンロードの進行状況を表示したいのですが、進行状況を表示せずにファイルがダウンロードされることです。ループ内で読み取ったバイトをログアウトしようとしましたが、ダウンロードプロセスが終了したときにすべてのログを取得しました。
編集: getInputStream() を使用して取得した InputStream オブジェクトは、すべてのコンテンツを既に保持しているようです。つまり、コンテンツは既にシステムのメモリ内のどこかにダウンロードされており、そのデータを読み取ると、非常に迅速に転送されます。
これには AsyncTask を使用しています。何か案は?ありがとう。
protected Void doInBackground() {
InputStream is = bodyPart.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
FileOutputStream fos = new FileOutputStream(f);
int bytesRead;
byte[] buf = new byte[MySettings.DOWNLOAD_BUFFER_SIZE];
while ((bytesRead = bis.read(buf)) != -1) {
totalBytes += bytesRead;
publishProgress((int)(((double)((double)totalBytes/(double)size))*100));
fos.write(buf, 0, bytesRead);
}
fos.flush();
fos.close();
bis.close();
mDialog.dismiss();
}
protected void onProgressUpdate(Integer... progress) {
mDialog.setProgress(progress[0]);
}
@Override
protected void onPreExecute() {
mDialog = displayWorkingDialog(messageWhileDownloading, c);
}
public void displayWorkingDialog(String message, Context c) {
mDialog = new ProgressDialog(c);
mDialog.setMessage(message);
mDialog.setCancelable(true);
mDialog.setIndeterminate(false);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.show();
}