1

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();
}
4

0 に答える 0