- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有标记为“播放”的单个按钮的基本 Swing UI。按下按钮时,标签变为“暂停”。现在按下按钮时,它会变为“恢复”。
在“播放”时,我正在实例化并执行一个 SwingWorker。我想要的是能够暂停这个线程(而不是取消它)并根据上面描述的按钮恢复它。但是,我不想在 doInBackground() 中使用 Thread.sleep()。这似乎有点骇人听闻。运行doInBackground的线程有什么办法阻塞吗?
最佳答案
Pause and Resume SwingWorker.doInBackground()
首先你必须确保正在执行的后台任务可以暂停,否则这个问题没有意义。所以假设任务可以暂停,那么你可以扩展SwingWorker使用一个简单的标志变量来控制后台线程状态:paused 或 not paused。
public abstract class PausableSwingWorker<K, V> extends SwingWorker<K, V> {
private volatile boolean isPaused;
public final void pause() {
if (!isPaused() && !isDone()) {
isPaused = true;
firePropertyChange("paused", false, true);
}
}
public final void resume() {
if (isPaused() && !isDone()) {
isPaused = false;
firePropertyChange("paused", true, false);
}
}
public final boolean isPaused() {
return isPaused;
}
}
子类可能会检查 isPaused()
状态,以便有效地继续执行任务。例如:
PausableSwingWorker<Void, String> worker = new PausableSwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
if (!isPaused()) {
// proceed with background task
} else {
Thread.sleep(200); // Optional sleep to avoid check status continuously
}
}
return null;
}
};
您也可以添加 PropertyChangeListener到工作人员并监听 paused
属性变化:
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("paused".equals(evt.getPropertyName())) {
System.out.println("Old status: " + evt.getOldValue());
System.out.println("New status: " + evt.getNewValue());
}
}
});
这是一个完整的例子。请注意,如果 worker 被停止,那么它就不能被暂停或恢复。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class Demo {
private void createAndShowGUI() {
final JTextArea textArea = new JTextArea(20, 50);
final PausableSwingWorker<Void, String> worker = new PausableSwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
if (!isPaused()) {
publish("Writing...");
} else {
Thread.sleep(200);
}
}
return null;
}
@Override
protected void process(List<String> chunks) {
String text = String.format("%s%n", chunks.get(chunks.size() - 1));
textArea.append(text);
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("paused".equals(evt.getPropertyName())) {
String text = (Boolean)evt.getNewValue() ? "Paused..." : "Resumed...";
textArea.append(String.format("%s%n", text));
}
}
});
Action pause = new AbstractAction("Pause") {
@Override
public void actionPerformed(ActionEvent e) {
worker.pause();
}
};
Action resume = new AbstractAction("Resume") {
@Override
public void actionPerformed(ActionEvent e) {
worker.resume();
}
};
Action stop = new AbstractAction("Stop") {
@Override
public void actionPerformed(ActionEvent e) {
worker.cancel(true);
}
};
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonsPanel.add(new JButton(pause));
buttonsPanel.add(new JButton(resume));
buttonsPanel.add(new JButton(stop));
JPanel content = new JPanel(new BorderLayout(8, 8));
content.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
content.add(new JScrollPane(textArea), BorderLayout.CENTER);
content.add(buttonsPanel, BorderLayout.SOUTH);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (!worker.isDone()) {
worker.cancel(true);
}
e.getWindow().dispose();
}
});
frame.add(content);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
worker.execute();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
abstract class PausableSwingWorker<K, V> extends SwingWorker<K, V> {
private volatile boolean isPaused;
public final void pause() {
if (!isPaused() && !isDone()) {
isPaused = true;
firePropertyChange("paused", false, true);
}
}
public final void resume() {
if (isPaused() && !isDone()) {
isPaused = false;
firePropertyChange("paused", true, false);
}
}
public final boolean isPaused() {
return isPaused;
}
}
}
关于java - 暂停和恢复 SwingWorker.doInBackground(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265002/
当尝试使用 Async task 执行 HTTP post 时,我得到以下信息: ASyncTask: DoInBackground(String...) clashes with DoInBackg
我正在尝试创建一个使用多个端口的服务器,以便可以轻松发送和接收不同的数据和信息,但在我的 doInBackground 方法中,我的代码卡在了 socket.receive 上,这是我的代码 whil
我正在开发一个基本的 Android 应用程序,它使用 HttpURLConnection 进行POST。我想从我的 Web API 返回响应消息。 我的MainActivity.java publi
我创建了一个小型 BackGroundWorker 来测试 pdf 文件。一切正常,直到代码捕获 pdf 文件的路径。我真的不知道为什么它不起作用 -.- 我也没有在 Eclipse 的控制台中收到任
我有一系列的 asyncTasks 一个接一个地执行以从服务器下载 pdf。但有时当我最小化应用程序然后恢复它(在后台下载)时,下一个 asyncTask 将在不久之后执行当前运行的 asyncTas
我在 AsyncTask 中有一个自定义进度对话框,它充当下载进度,我想在按下自定义取消按钮时中断 doInBackground。似乎当对话框关闭时,doInBackground 恢复没有任何问题!
我正在尝试从代码中的 5 个 URL 中获取值: new JsonTask().execute(urlPosts, urlPhotos, urlComments, urlComments, urlA
我有以下代码:- public class ByState extends Fragment { @Nullable @Override public View onCreat
有谁知道为什么 doInBackground 需要很长时间才能启动?这是一个例子: runDoInBackground(){ print("starting task"); new MyA
try { Get_Webpage obj = new Get_Webpage(url); directory_listings = obj.get_webpage_source();
我有一个带有标记为“播放”的单个按钮的基本 Swing UI。按下按钮时,标签变为“暂停”。现在按下按钮时,它会变为“恢复”。 在“播放”时,我正在实例化并执行一个 SwingWorker。我想要的是
我正在尝试创建一个使用 api 和 JSONObject 从网络提取信息的应用程序。我了解到我需要使用 asyncTask 来完成此操作,因此我创建了一个扩展 asyncTask 的类。但应用程序不断
我是android新手,我正在尝试在android中实现socket,它是一个简单的客户端服务器应用程序。我创建了 2 个按钮(“连接”、“断开连接”),并使用 AysncTask doInBackg
我在 AsynTask 类的 doInBackground 方法中使用 cognitouserpool 代码。但我的方法没有调用。我尝试过用日志检查它。它不起作用。 异步任务 public c
所以我进入了 SwingWorkers 来处理我使用不同的类和线程进行的文本操作。如下所示,我的 Swingworker 获取文件路径并扫描文本,将行传递给字符串。使用 getData(),我将扫描的
我试图在数据库上执行一些任务时显示进度条。但是,进度栏卡住,并且我想在数据库上执行的操作未执行。据我了解,为了保证 Swing 中的正确并发性,我需要在辅助线程上执行数据库任务。我也明白我的错误与 J
我想使用 ImageLoader.loadImage 下载多个图像,这将启动多个线程。因为它们需要一段时间才能执行,而且我不想锁定 UI,所以我想在 AsyncTask 的 doInBackgroun
我正在尝试使用 php 将从 Facebook api 获取的用户详细信息存储到数据库中。我使用 JSONParser 类来执行返回 JSON 对象的 POST。当我从 AsyncTask 中调用 J
我是初学者。我目前正在创建一个在用户和我的服务器之间建立连接的应用程序。例如,用户输入一些信息并单击按钮,然后所有信息将保存在我的服务器数据库表中。然而,在输入信息并单击按钮后,应用程序崩溃了。 lo
我正在尝试从 android Activity (一个简单的登录表单)执行 http 请求/响应,但是在我完成代码后它给了我一个错误,因为我必须将它放在一个线程中,我不熟悉异步任务,但我尝试实现它,但
我是一名优秀的程序员,十分优秀!