2016-12-27 3 views
0

У меня есть одна ситуация. У меня есть одно задание Eclipse, с помощью следующего кода:Работа Eclipse с доступом к пользовательскому интерфейсу

private class ExecutionJob extends Job { 
    public static final String MY_FAMILY = "myJobFamily"; 

    public ExecutionJob(String name) { 
     super(name); 
    } 

    @Override 
    protected IStatus run(IProgressMonitor monitor) { 
     monitor.beginTask("executing ...... ", IProgressMonitor.UNKNOWN); 
     methodForExecution(); 
     monitor.done(); 
     return Status.OK_STATUS; 
    } 

    @Override 
    public boolean belongsTo(Object family) { 
     return family == MY_FAMILY; 
    } 
} 

И это methodForExecution() имеет код, как показано ниже:

public void methodForExecution(){ 
    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("view_id"); 
} 

Теперь ситуация, работа открывает что-то вроде ProgressMonitor, и мой метод пытается получить доступ к пользовательскому интерфейсу, который на самом деле находится за контролем прогресса этой работы. И это дает NullPointerException, поскольку монитор прогресса не имеет ActiveWorkbenchWindow.

Я не могу использовать UIJob, так как я должен выполнить этот методForExecution() асинхронно. Может кто-то, пожалуйста, помогите мне решить это.

ответ

2

Код, который вы хотите запустить должен запустить в UI thead.

Если большая часть работы в задании обновляет пользовательский интерфейс и не существует длинного кода, отличного от UI, тогда вы должны использовать UIJob для его запуска. Это по-прежнему запланировано как работа, но метод runInUIThread выполняется в потоке пользовательского интерфейса.

Если у вас есть много кода без пользовательского интерфейса, особенно долго работает код, то использовать обычный Job, но вы должны будете использовать Display.asyncExec запустить метод в потоке пользовательского интерфейса:

Display.getDefault().asyncExec(new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     methodForExecution(); 
    } 
    }); 

В Java-Вы могли бы сделать:

Display.getDefault().asyncExec(this::methodForExecution); 

Вы также можете использовать syncExec вместо asyncExec ждать пользовательский интерфейс для обновления.

Если showView - это все, что вы хотите сделать, вы можете просто сделать asyncExec без использования Job.

+0

Я столкнулся с этой проблемой http://stackoverflow.com/questions/19325603/eclispe-does-not-show-progress-bar-of-user-threads при использовании UIJob – Rajan

+0

Если все, что вы делаете, это шоу работа будет закончена очень быстро и не будет времени, чтобы показать индикатор выполнения. –

+0

Я обновил ответ, чтобы быть более явным, когда использовать UIJob или обычный Job. –

Смежные вопросы