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