我正在設計一個API,使大量使用異步代碼完成塊。設計模式回調任意在UI線程
public interface IResult<T extends Result.I> {
void onResult(T);
}
public void doXYZ(IResult<Result.TypeA> iResult) { ... }
用戶會打電話給我的API的doXYZ(),和一個單獨的網絡工作者線程後來稱之爲iResult.onResult()。有時他並不關心onResult()被調用哪個線程,有時候他可能只想更新UI - 只是尋找一種方法來隱式卸載用戶的負擔,以便他們可以保持匿名內部類的整潔,小。
這個API適用於Android,在很多(但不是全部)時間,用戶可能想要在影響UI元素的onResult()回調中做些事情,因此必須在UI線程上運行它們的代碼。而不是讓用戶不得不用runOnUIThread(...)調用來弄髒他們的代碼,我想知道是否人們知道設計模式可以使doXYZ()調用時更容易用戶指定是否在其UI線程上調用回調。
出於性能方面的原因,我寧願不強求,我的API始終調用onResult()在UI線程上。我見過
一種模式是添加一個方法參數:doXYZ(...,布爾callOnUIThread)。但是,由於API是有文檔記錄的,所以我寧願不要弄髒所有這些額外的布爾值文檔(和方法簽名)。
另一個想法是重載每個doXYZ(),使其中一個沒有callOnUIThread參數,但對於文檔而言,這對於膨脹是非常不利的。
另一個以爲我是一個onResultUI()方法添加到IResult,除了onResult(),但是,通過讓他們不得不總是在他們的匿名類定義都弄髒了用戶的代碼。
任何建議乾淨的方式來完成這個: i。簡明 ii。非常適合代碼可讀性 iii。容易在文檔上 ?
想想用途代碼:你知道,如果代碼需要在GUI線程上運行創造了'IResult'實例的意義呢?在這種情況下,你可以提供一個標記接口'IRunsOnGui',如果客戶希望'onResult'在gui-thread上運行,那麼客戶端可以擴展它。當你添加'IResults'時,檢查它是否是'IRunsOnGui'的一個實例,並且只允許結果在gui-thread上運行。你可以看到這個例子[在ideone上](http://ideone.com/whEDB2)。如果這回答你的問題,我很樂意把它放在答案。 – BeyelerStudios
因此,基本上'doXYZ'正在調度將通過接口報告結果的異步作業。在這種情況下,標記和裝飾器都非常適合(甚至可以像我在[ideone-link](http://ideone.com/whEDB2)中看到的那樣組合):在示例中,Foreman bob將執行調度,'bob.dirve '會是你的'doXYZ')。選擇你喜歡的任何一種:通過裝飾他的'IResult'或者標記它以不同的方式運用給被調控者。在'doXYZ'中執行檢查是否派遣到您的一般工作者池或gui線程。 – BeyelerStudios