代码之家  ›  专栏  ›  技术社区  ›  usama8800

获取网页源代码而不冻结UI

  •  1
  • usama8800  · 技术社区  · 10 年前

    我正在尝试获取网页的源代码,但当我这样做时,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不冻结的地方获取源代码?怎样

    1 回复  |  直到 10 年前
        1
  •  3
  •   chrylis -cautiouslyoptimistic-    10 年前

    你的问题是,即使你使用 SwingWorker ,您立即转身告诉UI等待它( worker.get() ). 相反,您的员工应该使用 回调 --当它的工作完成时,它应该调用一些操作,可能是在事件线程上,告诉UI做下一件事。