- SwingWorker可以在后台执行耗时的任务,而避免阻塞前端的用户程序,避免界面长时间无响应
- SwingWorker有2个参数T , V
- T:为最终结果集 对应doInBackground方法前的返回值类型。通过调用swingworker的get方法可以取得返回值。
- V:为中间结果集 对应process方法的参数list的数据类型
- 在doInBackground方法中调用publish方法(注意publish方法只在SwingWorker类中实现)。可以发送中间结果V,然后这个结果由被发送到在EDT线程中的process方法中进行处理。
当doInBackground处理完后,会自动调用done方法。
我的例子是使用swingworker在后台取得adb logcat(该命令是安卓调试桥)命令产生的数据,你可以换成其他cmd命令,比如netstat命令
public class RunTest extends SwingWorker<Void, String>{
private JTextArea taConsole;
public RunTest(JTextArea taConsole){
this.taConsole = taConsole;
}
@Override
protected Void doInBackground() throws Exception {
try {
String cmd ="adb logcat";
Process process = Runtime.getRuntime().exec(cmd);
InputStream input = process.getInputStream();
InputStreamReader inr = new InputStreamReader(input,"UTF-8");
BufferedReader reader = new BufferedReader(inr);
String line = "";
while((line = reader.readLine()) != null){
publish(line);//publish将产生的中间结果传递给process,由process方法进行处理
}
reader.close();
process.waitFor();
}catch (Exception e) {
// TODO: handle exception
}
return null;
}
protected void done(){
System.out.println("后台方法运行结束");
}
protected void process(List<String> list){
for (String line :list){
if (line.trim().equals("")){
continue;
}else {
taConsole.append(line+"\n");
//在这里可以将line分割,得到自己想要的形式,并显示在前台界面上
//可以为日志分等级
char ch = line.charAt(0);
//...
}
}
}
}