2013-05-04 103 views

回答

4

用這種方法解決了問題。

我重新啓動應用程序,但首先手動關閉bluecove。

BlueCoveImpl.shutdown(); 

如果我只重新啓動應用程序,bluecove關閉,但在啓動過程中無法初始化藍牙堆棧。這裏是重啓的方法:

public static void restartApplication(Runnable runBeforeRestart) 
     throws IOException 
{ 
    try 
    { 
     // java binary 
     String java = System.getProperty("java.home") + "/bin/java"; 
     // vm arguments 
     List<String> vmArguments = ManagementFactory.getRuntimeMXBean() 
       .getInputArguments(); 
     StringBuffer vmArgsOneLine = new StringBuffer(); 
     for (String arg : vmArguments) 
     { 
      // if it's the agent argument : we ignore it otherwise the 
      // address of the old application and the new one will be in 
      // conflict 
      if (!arg.contains("-agentlib")) 
      { 
       vmArgsOneLine.append(arg); 
       vmArgsOneLine.append(" "); 
      } 
     } 
     // init the command to execute, add the vm args 
     final StringBuffer cmd = new StringBuffer("\"" + java + "\" " 
       + vmArgsOneLine); 

     // program main and program arguments 
     String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(
       " "); 
     // program main is a jar 
     if (mainCommand[0].endsWith(".jar")) 
     { 
      // if it's a jar, add -jar mainJar 
      cmd.append("-jar " + new File(mainCommand[0]).getPath()); 
     } 
     else 
     { 
      // else it's a .class, add the classpath and mainClass 
      cmd.append("-cp \"" + System.getProperty("java.class.path") 
        + "\" " + mainCommand[0]); 
     } 
     // finally add program arguments 
     for (int i = 1; i < mainCommand.length; i++) 
     { 
      cmd.append(" "); 
      cmd.append(mainCommand[i]); 
     } 

     // execute the command in a shutdown hook, to be sure that all the 
     // resources have been disposed before restarting the application 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() 
      { 
       try 
       { 
        Runtime.getRuntime().exec(cmd.toString()); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     // execute some custom code before restarting 
     if (runBeforeRestart != null) 
     { 
      runBeforeRestart.run(); 
     } 
     // at first shut down BlueCove manually 
     BlueCoveImpl.shutdown(); 

     System.exit(0); 
    } 
    catch (Exception e) 
    { 
     // something went wrong 
     throw new IOException(
       "Error while trying to restart the application", e); 
    } 
}