2014-04-10 2 views
2

리스너가있는 여러 UI 구성 요소가 있습니다. 이러한 모든 리스너는 dialogChanged() 메서드를 호출합니다. 내 목표는이 메서드에서 일부 긴 처리 및 UI 고정시키지 않는 것입니다. Lars Vogel에 따르면 런타임 중에 실행되는 UISynchronize의 도움으로이를 수행 할 수 있습니다. 그러나 그것은 나를 위해 실패합니다.이 유형의 필드는 주입되지 않고 NullPointerException이됩니다.Eclipse 플러그인 개발, 장기 실행 태스크

@Inject UISynchronize sync; 
Job job = new Job("My Job") { 

    @Override 
    protected IStatus run(IProgressMonitor arg0) 
    { 
     sync.asyncExec(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       updateStatus("Checking connection..."); 
       if (bisInstallDirSelected) 
        bisSettingsChanged(); 
       else 
        jarSettingsChanged(); 
      } 
     }); 
     return Status.OK_STATUS; 
    } 

}; 
protected void dialogChanged() 
{ 
    job.schedule(); 
} 

방법 updateStatus(String s), bisSettingsChanged()jarSettingsChanged() presice을로, 그들은 누군가가 내가 뭐하는 거지 말해 수 있다면 나는 감사하겠습니다 슈퍼 클래스 org.eclipse.jface.wizard.WizardPage 방법 setErrorMessage(String newMessage)를 사용하여 UI와 상호 작용 : 여기 내 코드의 관련 부분입니다 잘못되었거나이 문제를 해결할 수있는 더 좋은 방법을 제안합니다.

+0

클래스가이 코드가 포함 된 무엇을? @Inject는 애플리케이션 모델이 알고있는 클래스 (예 : MPart 클래스)에서만 작동합니다. –

+0

클래스는 간접적으로'org.eclipse.jface.wizard.WizardPage'를 확장하고 다른 의존성을 가지지 않습니다. –

답변

1

@Inject는 e4 응용 프로그램 모델이 만드는 클래스 (예 : Part 또는 Command Handler의 클래스)에서만 사용할 수 있습니다.

또한 ContextInjectionFactory을 사용하여 자신의 수업에 삽입 할 수 있습니다.

주입하면 UI 스레드에서 코드를 실행하는 '전통적인'방법으로 사용할 수 있습니다 수행하지 않은 클래스에 대한

:

Display.getDefault().asyncExec(runnable); 
+0

'getShell(). getDisplay(). asyncExec()'와 함께 작업하려했지만 UI가'dialogChanged()'실행 중에 멈 춥니 다. 정적 메소드를 사용한 제안에도 동일하게 적용됩니다. –

+0

또한'Thread.currentMethod()'를 사용하여 runnable을 실행하는 쓰레드와'dialogChanged()'를 호출하는 쓰레드를 비교하여 같은 쓰레드 ('main')로 판별했습니다. 그것은 UI가 얼어 버리는 이유를 설명하고 있지만 asyncExec()가 외부 스레드로 처리를 스왑 할 것으로 예상했습니다. –

+0

기다려 ... 내 오류를 이해하는 것 같아 :) UI와 상호 작용하는 코드에서 처리를 차단하는 코드를 어떻게 든 분리해야한다 ... –

관련 문제