2013-11-28 2 views
0

У меня есть много кода, который повторяет строки, как показано ниже. Как сделать это как метод?Как заменить Display # asyncExec (Runnable) на метод?

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

Что вы подразумеваете под "_How, чтобы сделать этот метод_"? Вам всегда придется поместить ваш код в «Runnable», по крайней мере, поэтому вам нечего экономить. Просто из любопытства, почему вы так часто так поступаете? – Baz

+2

BTW, очень родственный: [код передачи как параметр] (http://stackoverflow.com/questions/8657948/passing-code-as-parameter) – Baz

+0

Эта часть кода является стандартным способом в SWT для обновления GUI из другого потока это не поток GUI. Я часто использую этот код в своем приложении, и я ищу способ сократить его, например, сделать это как метод. Так что вопрос. Но Ты помог мне с этим связанным вопросом. Спасибо. – marioosh

ответ

1

Ok, чтобы сделать это более заметным, позвольте мне опубликовать ответ:

код у вас есть там короче, как он получает, потому что только вещи, которые вы можете перейти на методы являются переменными или скаляры ,


Для частного случая, когда все ваши звонки на Display#asyncExec(Runnable) то же самое, вы могли бы сделать что-то вроде этого:

public class MyClass implements Runnable 
{ 
    public void myMethod() 
    { 
     /* Your other code here */ 
     Display.getDefault().asyncExec(this); 
    } 

    @Override 
    public void run() 
    { 
     /* Update the GUI here */ 
    } 
} 

Другой альтернативой было бы создание классов для каждой цели обновления GUI , каждое осуществление Runnable:

public class GuiUpdaters 
{ 
    public static class TableViewerUpdater implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      /* Update your TableViewer here */ 
     } 
    } 

    public static class StatusBarUpdater implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      /* Update your Status bar here */ 
     } 
    } 
} 

Вы бы назвали th эм нравится:

/* Update the TableViewer */ 
Display.getDefault().asyncExec(new TableViewerUpdater()); 

/* Update the status bar */ 
Display.getDefault().asyncExec(new StatusBarUpdater()); 
0

Вы также можете создать один экземпляр вашего рисования подпрограмм, когда не требуется никаких аргументов:

final Runnable tableDrawer = new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     /* Update your TableViewer here */ 
    } 
}; 

затем в коде, просто используйте:

Display.getDefault().asyncExec(tableDrawer); 

Несколько способов оптимизации: если вы уже находитесь в showthread, вы можете вызвать метод run самостоятельно - в противном случае запустите его asyncExec.

Вы можете создать вспомогательный класс для выполнения этих задач. Класс-помощник может проверить, находитесь ли вы в или из потока отображения, отслеживаете количество раз, когда используется процедура рисования, и предупреждайте вас, когда задача рисования занимает слишком много времени для выполнения. (Все, что более 1000 миллисекунд, вероятно, не очень хорошо, и должно быть завершено в диалоговом окне прогресса.)

Если вы делаете много обновлений графического интерфейса, сгруппируйте их, чтобы сделать как можно больше в одном рисование «runnable» события. Например, если вы рисуете строки текста на консоль, не нарисуйте одну строку для каждой строки текста, вместо этого нужно иметь ArrayList строк, которые нужно нарисовать .. затем вызвать ничью, когда list.size() == 1. Когда появляется много строк текста, ускорение будет драматичным.

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