需求:json
樓主前幾天解決一個問題,大體給描述一下。我須要同時去使用url和sdk請求數據,優先使用url結果,有超時限制,超時後使用sdk結果。搞清楚了需求,再去看問題,由於以前早早就把sdk和url的model層代碼寫好了,等因而要在control層作一下邏輯處理,不能作太大的代碼改動,兩個結果都是異步返回異步
解決方案:ide
1 :同時發起url和sdk結果檢索 ,發起檢索的時候同時設置一個TimerTask 函數
2 :讓TimerTask同時去實現url和sdk的監聽器,並在TimerTask的構造函數裏面傳入最終結果的回調監聽器。性能
3:全部的邏輯就能夠很簡單的在Task的回調方法中實現了this
我有三個監聽器,分別是:url
1:結果搜索管返回監聽器qt
public interface MapListenner { void mapSearched(JSONObject object); }
2:sdk結果返回監聽器class
public interface SDKSearchedListenner { void onSDKSearched(JSONObject json); }
3:url結果返回監聽器,object
public interface URLSearchedListenner { void onURLSearched(JSONObject json); }
再看看個人Task實現類,我這裏寫的是一個內部類
/** * 請求檢索調度執行的task */ static class QueryTask extends TimerTask implements URLSearchedListenner , SDKSearchedListenner { MapListenner mpListenner ; JSONObject sdkResult = new JSONObject(); public QueryTask(MapListenner mpl) { mpListenner = mpl; } @Override public void run() { this.cancel(); mpListenner.mapSearched(sdkResult); } @Override public void onURLSearched(JSONObject json) { this.cancel(); mpListenner.mapSearched(json); } @Override public void onSDKSearched(JSONObject json) { sdkResult = json ; } }
有了這樣的一個多態的類,我就很輕鬆的可以在外部去調用了,在外部同時發起sdk和url檢索的時候,同時發起這樣的多態的監聽器,剩下的就不用管了~
QueryTask qt = new QueryTask(listenner); mTimer.schedule(qt, TIME);
總結:必定要善用Java中的多態,多實現的特性。用好了,會讓咱們的程序變得很是的優美,而且高性能。