2012-03-07 96 views
3

我有一些问题P2的自动更新,当我在本地做,从本地存储库的所有工作正常,我可以重新开始做我的自动更新,但当我尝试从网络回购来更新我有这些错误:P2自动更新

An internal error occurred during: "Install download0". 
org.eclipse.swt.SWTException: Invalid thread access 

真的,我不明白是什么区别。 在我ApplicationWindowWorkbenchAdvisor我有这个帖子窗口打开方法:

private static final String JUSTUPDATED = "justUpdated"; 

public void postWindowOpen() { 
    final IProvisioningAgent agent = (IProvisioningAgent) ServiceHelper 
      .getService(Activator.bundleContext, 
        IProvisioningAgent.SERVICE_NAME); 
    if (agent == null) { 
     LogHelper 
       .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 
         "No provisioning agent found. This application is not set up for updates.")); 
    } 
    final IPreferenceStore prefStore = Activator.getDefault() 
      .getPreferenceStore(); 
    if (prefStore.getBoolean(JUSTUPDATED)) { 
     prefStore.setValue(JUSTUPDATED, false); 
     return; 
    } 

    IRunnableWithProgress runnable = new IRunnableWithProgress() { 
     public void run(IProgressMonitor monitor) 
       throws InvocationTargetException, InterruptedException { 
      IStatus updateStatus = P2Util.checkForUpdates(agent, monitor); 
      if (updateStatus.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { 
       PlatformUI.getWorkbench().getDisplay() 
         .asyncExec(new Runnable() { 
          public void run() { 
           MessageDialog.openInformation(null, 
             "Updates", "No updates were found"); 
          } 
         }); 
      } else if (updateStatus.getSeverity() != IStatus.ERROR) { 
       prefStore.setValue(JUSTUPDATED, true); 
       PlatformUI.getWorkbench().restart(); 
      } else { 
       LogHelper.log(updateStatus); 
      } 
     } 
    }; 
    try { 
     new ProgressMonitorDialog(null).run(true, true, runnable); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
    } 

} 

在我P2Util这样的:

public static IStatus checkForUpdates(IProvisioningAgent agent, 
     IProgressMonitor monitor) { 
    ProvisioningSession session = new ProvisioningSession(agent); 
    UpdateOperation operation = new UpdateOperation(session); 
    SubMonitor sub = SubMonitor.convert(monitor, 
      "Checking for application updates...", 200); 
    IStatus status = operation.resolveModal(sub.newChild(100)); 
    if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { 
     return status; 
    } 
    if (status.getSeverity() == IStatus.CANCEL) 
     throw new OperationCanceledException(); 

    if (status.getSeverity() != IStatus.ERROR) { 
     ProvisioningJob job = operation.getProvisioningJob(null); 
     status = job.runModal(sub.newChild(100)); 
     if (status.getSeverity() == IStatus.CANCEL) 
      throw new OperationCanceledException(); 
    } 
    return status; 
} 

在我PreferenceInitializer这样的:

node.putBoolean(PreferenceConstants.PREF_AUTO_UPDATE_ENABLED, true); 
node.putBoolean(PreferenceConstants.PREF_AUTO_UPDATE_SCHEDULE, true); 
node.putBoolean(PreferenceConstants.PREF_DOWNLOAD_ONLY, true); 

我重复一遍:从本地回购我可以进行自动更新,但是从网络的回购我不能。 感谢您的阅读。

回答

4

有问题的代码

new ProgressMonitorDialog(null).run(true, true, runnable); 

这就是所谓的UI线程会抛出的错误外......你必须在asyncExec呼叫也把这个包

+0

是的,我发现“解决方案“在互联网上,但总是给我那个错误。如你所说的问题是新ProgressMonitor。如果你介绍的,而不是该NullProgressMonitor一切工作正常:\t IStatus updateStatus = P2Util.checkForUpdates(代理,新NullProgressMonitor());谢谢 :) – 2012-03-09 09:38:24