1

.NET アプリを Java に移植しようとしていますが、.NET の WebClient とその DownloadFileCompleted イベントと同様に、ダウンロード (または非同期タスク) が完了すると進行状況バーをインクリメントする非同期ダウンローダーが必要です。アプリはダウンロードが完了するのを待っていますが、ダウンロード中に UI が「応答なし」でロックアップしたくありません。問題は、進行状況バーがメイン スレッドで作成されたため、ダウンロード スレッドが進行状況バーを直接インクリメントできないことにあります。これは SWT アプリ (os メッセージ ポンプ ループを備えている) であるため、どうにかしてダウンロード スレッドからメッセージをポンプし、メイン スレッドにそれを取得させることができると考えていました。これは可能ですか?別の方法はありますか?

4

2 に答える 2

3

JFace を使用できる場合は、以下を使用できますProgressMonitorDialog

ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
dialog.run(true, true, new IRunnableWithProgress() {
    public void run(IProgressMonitor monitor) throws InterruptedException {
        // This is a forked thread and updates only monitor, monitor is responsible for updating UI

        monitor.beginTask("Downloading...", totalBytes);

        // Loop to download bytes
        ...
        monitor.worked(1);
        ...

        // Completed
        monitor.done();
    }
});

JFace を使用したくない場合は、このクラスの実装を見て、同様の実装を複製してProgressBarコントロールを更新する方法を確認できます。通常Display#async(IRunnable)、UI にアクセスするランナブルを投稿するために使用できます。ダウンロード スレッドの進行状況コントロールがわかっている場合は、これを使用して UI を更新できます。

于 2012-11-22T17:25:46.353 に答える
2

Display.asyncExec を使用して、ダウンロード スレッドから進行状況バーの値を更新してみてください。

Display.getCurrent().asyncExec(new Runnable() {         
        @Override
        public void run() {
        // update progress bar value here
        }

});

理解できたかどうかはわかりませんが、次のようなものが実行できる可能性があります。

class Downloader {
    public static void downloadAsync(Object object, String url, final ProgressBar progressBar ){
            // download thread
        new Thread(new Runnable() {
            @Override
            public void run() {
                // start download here
                // while download progresses
                Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        progressBar.setSelection(<your progress value>);
                    }
                });
            }
        });
    }
}
于 2012-11-22T17:29:09.820 に答える