2014-03-26 18 views
1

所以我SparkleAcrivator类如何等待Sparkle updater(java app)中的用户操作?

public class SparkleActivator { 
    private static boolean sparkleLibLoaded = false; 
    //private String downloadLink; 
    private String menuItemTitle; 

    public native static void initSparkle(String pathToSparkleFramework, 
              boolean updateAtStartup, 
              int checkInterval, 
              /*String downloadLink,*/ 
              String menuItemTitle); 

    private boolean updateAtStartup = true; 
    private int checkInterval = 86400; 

    public SparkleActivator(/*String downloadLink, */String menuItemTitle) { 
     //this.downloadLink = downloadLink; 
     this.menuItemTitle = menuItemTitle; 
    } 

    public void start() throws Exception { 
     try { 
      if(!SparkleActivator.sparkleLibLoaded) { 
       System.loadLibrary("sparkle_init"); 
       SparkleActivator.sparkleLibLoaded = true; 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return; 
     } 

     initSparkle(System.getProperty("user.dir") + "/../../Frameworks/Sparkle.framework", 
       updateAtStartup, checkInterval, /*downloadLink, */menuItemTitle); 
    } 
} 

而且在那里我开始我的独立的应用程序使用的主类旌宇

public static void main(final String... args) { 

       if (Helper.isOsx()) { 

        try { 
         sparkleActivator.start(); 
        } catch (Exception e) { 
         new ExceptionHandler(true, 19).handleException(new NotFountSparkleInitException()); 
         return; 
        } 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() {        
           initApp(); 

         } 
        }); 
       } 
       else {     

    } 

有问题是火花,我的应用程序几乎同时开始,但我需要等待的行动从Sparkle窗口中的用户,然后启动我的应用程序。

感谢您的帮助。

回答

0

我们知道的是Sparkle updater requires to be called on the main thread(即GUI线程)。因此,您的应用程序需要运行才能调用它。我不认为有一个明显的方法来解决这个问题。但是,...

您可以规避此问题的一种方式是,在用户完成与更新程序的交互之前,将应用程序的可见性设置为false。

例如,您可以添加事件listener to your JNIadd listeners to your updater thread。但是,线程上的监听器需要返回用户操作而不是完成时。