我正在尝试获取网页的源代码,但当我这样做时,UI会冻结。我甚至使用了SwingWorker,但它不起作用。这里是SSCCE:
import java.awt.Dimension; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.concurrent.ExecutionException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public class SSCCE extends JPanel { public SSCCE() { setPreferredSize(new Dimension(200, 50)); JFrame frame = new JFrame(); frame.add(this); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); JButton action = new JButton("Action"); action.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SwingWorker<String, Void> worker = new SwingWorker<String, Void>(){ protected String doInBackground() { try { URL url = new URL("http://stackoverflow.com/"); InputStream is = url.openStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } if (is != null) is.close(); String source = sb.toString(); return source; } catch (IOException e) { return null; } } }; worker.execute(); try { System.out.println(worker.get()); } catch (HeadlessException | InterruptedException | ExecutionException e1) { e1.printStackTrace(); } } }); add(action); JButton nothing = new JButton("Nothing"); add(nothing); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new SSCCE(); } }); } }
有没有更好的方法获取源代码,或者在UI不冻结的地方获取源代码?怎样
你的问题是,即使你使用 SwingWorker ,您立即转身告诉UI等待它( worker.get() ). 相反,您的员工应该使用 回调 --当它的工作完成时,它应该调用一些操作,可能是在事件线程上,告诉UI做下一件事。
SwingWorker
worker.get()