需求: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中的多态,多实现的特性。用好了,会让咱们的程序变得很是的优美,而且高性能。