需求:
楼主前几天解决一个问题,大致给描述一下。我需要同时去使用url和sdk请求数据,优先使用url结果,有超时限制,超时后使用sdk结果。搞清楚了需求,再去看问题,因为之前早早就把sdk和url的model层代码写好了,等于是要在control层做一下逻辑处理,不能做太大的代码改动,两个结果都是异步返回
解决方案:
1 :同时发起url和sdk结果检索 ,发起检索的时候同时设置一个TimerTask
2 :让TimerTask同时去实现url和sdk的监听器,并在TimerTask的构造函数里面传入最终结果的回调监听器。
3:所有的逻辑就可以很简单的在Task的回调方法中实现了
我有三个监听器,分别是:
1:结果搜索管返回监听器
public interface MapListenner { void mapSearched(JSONObject object); }
2:sdk结果返回监听器
public interface SDKSearchedListenner { void onSDKSearched(JSONObject json); }
3:url结果返回监听器,
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中的多态,多实现的特性。用好了,会让我们的程序变得非常的优美,并且高性能。