2016-03-15 4 views
0

Я создал интерфейс с одним методом:Java, метод с обратным вызовом считается async?

public interface ResultCallback { 
    void onResult(String message); 
} 

И у меня есть объект с методом, который имеет интерфейс в качестве параметра:

public class Command() { 
    public void methodWithCallback(int param1, String param2, ResultCallback callback) { 
     // There are some calculations 
     callback.onResult(param2); 
    } 
} 

Затем в моем файле Main Java Я пишу это:

public class Main() { 
    public static void main(String[] args) { 
     Command c = new Command(); 
     c.methodWithCallback(int 0, "SOME STRING", new ResultCallback() { 
     @Override 
     public void onResult(String str) { 
     // work with str 
     outsideMethod(str); 
     } 
     }); 
    } 

    public void outsideMethod(String str) { 
     // some code 
    } 
} 

Этот код может считаться async? И безопасно ли вызывать outsideMethod для обработки параметров?

+0

Нет, вы просто вызываете обратный вызов синхронно. –

+0

@JohannesJander Так безопасно ли вызывать 'outsideMethod' внутри' onResult'? –

+0

Да, ничего страшного в этом. –

ответ

1

Один из способов сделать это ASync является следующее:

public class Command { 

    private ExecutorService iExecutor; 

    public Command(ExecutorService executor) { 
     iExecutor = executor; 
    } 

    public void methodWithCallback(final int param1, final String param2, final ResultCallback callback) { 
     iExecutor.execute(new Runnable() { 
      @Override 
      public void run() { 
       // There are some calculations 
       callback.onResult(param2); 
      } 
     }); 
    } 
} 

Вы должны знать, что вы делаете, если при использовании потоков. Вещи должны быть потокобезопасными и т. Д., В зависимости от того, как вы делаете вещи. Чтобы запустить команду в одном потоке, создайте один поток Executor и передайте тот же Исполнитель всем Commmand, например:

ExecutorService executor = Executors.newSingleThreadExecutor(); 
Command command1 = new Command(executor); 
Command command2 = new Command(executor); 
2

Как сказано, это не асинхронный. Для вызова async метод должен выполняться в другом потоке.

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

+0

Что мне нужно добавить в мой класс 'Command', чтобы он работал как async. Можете ли вы привести пример. Это может помочь и другим. –

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