日前,做了一个小练习,采用的hessian框架实现的网络访问,其中在传统的hessian网络访问请求中加入了一些异步的元素。如下图为传统的hessian请求的简略图
我们以登录为例,来看看代码的流程:
请求:
接口中阻塞式登录方法,自己代码:
/**登录--登录**/
public User login(String userName,String passWord,long id,int typeId) throws InteractionException;
产生通过HessianProxyFactory产生HessianProxy的方法,看源码:
public Object create(Class<?> api, URL url, ClassLoader loader)
{
if (api == null)
throw new NullPointerException("api must not be null for HessianProxyFactory.create()");
InvocationHandler handler = null;
handler = new HessianProxy(url, this, api);
return Proxy.newProxyInstance(loader,
new Class[] { api,
HessianRemoteObject.class },
handler);
}
得到HessianProxy以后,调用里面的invoke方法即login的代理方法实现登录简单的请求,看源码。
public Object invoke(Object proxy, Method method, Object []args)
throws Throwable
{
.......
AbstractHessianOutput out = _factory.getHessianOutput(os);
out.call(methodName, args); //将登录方法名和参数写出去
out.flush();
........
}
通过得到的HessianProxy直接调用第一步中的login方法即可,自己代码:
proxy.login("duancanmeng","123");
在上面的基础假如一些异步的元素,
如何来体现异步性?
无非就是开线程,那到底该如何开呢?在哪里开呢?开什么样的线程?
首先想到的应该就是把HessianProxy中的invoke放入新开的线程中处理,这是最基本的。直接new Thread行吗?
当然可以,于是可以写一个类HessianNewProxy继承HessianProxy,复写invoke方法,这里面可以做一些检查,如果判断是异步的,则在新开的线程中调用父类的invoke方法,否则,直接在主线程中调用父类的invoke方法:
HessianNewProxy:
invoke(){
if(异步){
new Thread(){
run(){
super.invoke();
}
}.start();
}else{
super.invoke();
}
}
可是在android中并不推荐直接new Thread来执行异步请求(考虑到一些界面刷新的问题),android内部封装了自己的异步任务类AsynTask。可是普通的java项目却并没有如此的异步任务类,要想实现普通java项目也能和android项目一样