2016-03-15 55 views
0

我已經創建的接口與一個方法:Java,回調方法是否考慮異步?

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); 
    } 
} 

然後在我的主要的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 
    } 
} 

此代碼是否可以視爲異步?是否可以撥打outsideMethod來處理參數?

+0

不,你只是同步調用回調。 –

+0

@JohannesJander那麼可以安全地在'onResult'內調用'outsideMethod'嗎? –

+0

是的,沒有錯。 –

回答

1

的一種方式,使其異步如下:

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); 
      } 
     }); 
    } 
} 

你要知道你是否使用線程做什麼。事情必須是線程安全的,這取決於你如何做事。在單個線程上運行命令創建一個單獨的線程執行器,並通過相同的執行人所有條命令,就像這樣:

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

如上所述,它不是異步的。對於調用異步,該方法應該在另一個線程上執行。

因爲它是從靜態方法調用的,所以不能調用outsideMethod。你需要一個main的實例來調用outsideMethod。如果安全與否取決於代碼的作用。

+0

我需要將什麼添加到我的'Command'類中,以使其工作爲異步。你能舉個例子嗎?這對其他人也有幫助。 –