2016-06-25 36 views
1

我有Java代碼大致是這樣的:返回在內部回調獲得一個字符串從外部函數

public String render(String str) { 
    byte[] b = [serialize str] 
    client.sendRequest(b, new Callback<byte[]>() { 
    @Override 
    public void onDone(byte[] data) { 
     String res = [convert data back to String] 
     // TODO: return this string in the outer function 
    }); 
    return "???"; 
} 

我有問題越來越呈現函數返回,我從獲得的字符串onDone回調。我嘗試初始化SendRequest調用之外的String res,但遇到變量不是最終的問題。

我也在閱讀Java期貨here。從那以後,我想我可以設置一個Future,然後調用isDone()來確保它已設置?然而,這段代碼看起來很冗長,我想知道是否有更簡單的解決方案。

+0

這裏沒有要求/相關的序列化。無論存在什麼問題 - 範圍/時間安排問題 - 都將繼續取消任何提及。 IE瀏覽器。嘗試「返回數據」,這不會出於相同的概念原因。使用一個異步代碼,模型*必須完全切換到一個異步模型(包括Futures,它只是推遲決策,或者在回調中進一步處理),或者使用同步方法(可以包括'同步等待異步方法去完成')。 – user2864740

回答

1

我有問題讓渲染函數返回從onDone回調中獲得的字符串。我嘗試初始化SendRequest調用之外的String res,但遇到變量不是最終的問題。

您不能從匿名類更改基元或不可變類型的最終變量,也不能訪問非最終變量。所以,你可以:

命名的內部類,而不是可變類的匿名

  • 使用最終目標

    • 使用(StringBuilder的或的StringBuffer)

    • 創建可變類,這將是剛剛的「持有人」所需值,創建其類型的最終變量,並從匿名類中爲其設置值;或者爲了相同的目的使用所需類型的數組。

    [見this]

    但返回從外部函數值之前,你顯然不應該等到匿名類的方法將完成其工作。

  • +0

    謝謝,我查看了鏈接,並嘗試使用該解決方案,通過最終的String []和設置索引0,但有人告訴我,如果我在單獨的線程上運行,那麼第0個索引不能保證設置。我最終使用ArrayBlockingQueue來實現這個同步行爲。 –

    相關問題