一个实际使用Okhttp的例子,弄明白了应该是可以直接用到实际应用中去的。我也是从一个用到的项目中摘出来的,保证了同一时刻只有一个http的请求。
代码下载地址
代码的简单说明
两个module mobile,okhttpuselibrary。主要的工作都是在okhttpuselibrary中做的。
- ProtocolManager类。
IOkhttpManager类中定义了我们在整个应用中所有要实现的http的请求(代码里面我只是写了一个简单的请求,通过geit去请求http://192.168.11.1/goform/AppSwitchOTT?type=get的返回值)。ProtocolManager中会实现我们所有的请求组合Url,解析得到的返回值。例如
@Override
public SwitchState getSwitchState() throws ResponseError {
SwitchStateUrl url = SwitchStateUrl.getSTBStatus("http://192.168.11.1/goform");
return httpInteractForeground(url, new SwitchStateParse());
}
这个请求是通过SwitchStateUrl去组合get请求,通过SwitchStateParse去解析我们的请求。
ProtocolManager 中http请求的时候我们用到了Future等待到获取返回结果,用到了ExecutorService单线程池保证同一时刻只有一个请求(用了一个扩展的ExecutorService可以设置优先级因为在http请求的时候我们肯定希望前台Foreground的请求的优先级要高,后台Background的优先级要低)。具体的可以参照代码来看哦。
ProtocolClient类调用okhttp库中的方法通过get,post方法处理相应的数据。(这里只用到了execute同步的方法)
UrlBuilder Url组合的父类,每个请求的Url都要从这个类继承。
AbsJSONParser json解析的父类,每个请求的解析都要从这个类继承。
哎,其他的类的作用可以直接看代码。
在代码中我只是做了一个请求只是用来测试用的,一个应用中肯定不能只有一个请求的,所以要改的地方是okhttpuselibrary工程com.vae.wuyunxing.okhttpuselibrary.protocols.parse增加对应请求的json解析类(可以参考SwitchStateParse类的实现),com.vae.wuyunxing.okhttpuselibrary.protocols.url中加对应请求的Url的组和类(可以参考SwitchStateUrl类的实现)。这样请求的Url有了,请求到的数据的解析我们有了,剩下的就是在哪里实现了IOkhttpManager类中写接口(参考IOkhttpManager类中的getSwitchState),然后ProtocolManager类中实现他(参考ProtocolManager类中getSwitchState的写法)。实现有剩下就是只要能调用就可以了参考getSwitchState调用的地方。
/** only for text okhttp */
Task.callInBackground(new Callable<Void>() {
@Override
public Void call() throws Exception {
IOkhttpManager okhttpManager = MobileApplication.getInstance().getOkhttpManager();
okhttpManager.getSwitchState();
return null;
}
});
注意:如果按照给的代码中的写法请求的是阻塞的要在线程中调用不能在UI线程中调用哦。可以使用bolts task库(Android 下的 bolts tasks)。
因为在Application里面就绑定了ProtocolManager这样就可以随时调用http请求。先通过MobileApplication.getInstance().getOkhttpManager();得到IOkhttpManager。在通过IOkhttpManager去调用我们定义的请求。不管在哪个Activity中都可以这样调用。
(注意AndroidManifest.xml文件中申明网络权限,和注册ProtocolManager)。