【发布时间】:2017-03-23 07:28:39
【问题描述】:
在 Netbeans 中,我正在尝试创建一个 UI 如下所示的桌面应用程序:
我正在通过 Java 代码执行“adb logcat 命令”,它会在几秒钟内加载 1000 行日志,并且我打算通过 NetBeans 中的 jTable 显示所有这些信息。
使用参数:adb logcat -t 100 -> 我现在将日志限制为 100 行。 但是,小程序在 1000 行或取消对行数的限制时变得无响应(或卡在 process() 方法中)。
我不确定我是否在我的代码中正确实现了 SwingWorker 线程。我正在寻找有关如何改进代码以动态加载大量数据而不会导致小程序无响应的建议。
以下是小程序的实现代码...具有2个功能:
- 从applet的init()方法调用viewLogs()。
-
SwingWorker 实现。
public void viewLogs() throws IOException { String[] command = {"CMD","/C", "adb logcat -t 100"}; ProcessBuilder probuilder = new ProcessBuilder( command ); probuilder.directory(new File("c:\\Users\\k.garg\\Desktop\\")); Process process = probuilder.start(); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); br = new BufferedReader(isr); DefaultTableModel model = (DefaultTableModel)jTable1.getModel(); worker.execute(); try { int exitVal = process.waitFor(); System.out.println("exitVal = " + exitVal); } catch (InterruptedException e) { e.printStackTrace(); } } public class TableSwingWorker extends SwingWorker<DefaultTableModel, Object[]>{ private DefaultTableModel tableModel; public TableSwingWorker(DefaultTableModel tableModel){ this.tableModel = tableModel; } @Override protected DefaultTableModel doInBackground() throws Exception { Thread.sleep(2000); //added for initial UI to load System.out.println("Start populating"); String line, date, time, loglevel, PID, TID, tag, message=""; String log; int count = 0; while ((log = br.readLine()) != null) { count++; String[] splitLog = log.trim().split("\\s+"); line = Integer.toString(count); date = splitLog[0]; time = splitLog[1]; PID = splitLog[2]; TID = splitLog[3]; loglevel = splitLog[4]; tag = splitLog[5]; for(int i=6; i<splitLog.length;i++){ message += splitLog[i]; } publish(new Object[]{line, date, time, PID, TID, loglevel, tag, message}); } return tableModel; } @Override protected void process(List<Object[]> chunks) { System.out.println("Adding " + chunks.size() + " rows"); for(Object[] row: chunks) tableModel.insertRow(0,row); }}
【问题讨论】:
-
作为一般建议,
Process应该在SwingWorker中启动,因为waitFor将阻止事件调度线程并阻止 UI 更新
标签: java swing file-io jtable swingworker