关于Hessian以及hessdroid请参考本博文章:[hessdroid]Android下使用Hessian与Java服务端通讯(http://www.cnblogs.com/over140/archive/2010/07/30/1788563.html)。
一、测试结果截图
1.1 服务端控制台输出截图
1.2 客户端 测试对象传出 截图
二、通讯接口
2.1 BasicAPI
/*
*
*/
public String hello();
/*
* 测试中文字符
*/
public String TestChinese(String str);
/*
* 测试对象传入
*/
public void TestObject(TestVO vo);
/*
* 测试对象传出
*/
public TestVO TestObject();
/*
* 测试HashMap
*/
public HashMap TestHashMap(HashMap map);
/*
* 测试数组
*/
public String[] TestArray(String[] strArray);
/*
* 测试泛型
*/
public List<String> TestList(List<String> list);
}
2.2 TestVO
public int Id;
public String Title;
public String Content;
}
三、服务端(Java Web Server)
/**
*
*/
private static final long serialVersionUID = -8301199876420831947L;
private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
}
public String hello()
{
return _greeting;
}
/*
* 测试中文传输
* @see com.BasicAPI#TestChinese(java.lang.String)
*/
@Override
public String TestChinese(String str) {
System.out.println("TestChinese:"+str);
return "欢迎来到服务端!";
}
/*
* 测试HashMap
* @see com.BasicAPI#TestHashMap(java.util.HashMap)
*/
@Override
public HashMap TestHashMap(HashMap map) {
System.out.println("TestHashMap:"+map.get("abc"));
map.put("result", "ok");
return map;
}
/*
* 测试TestObject传入
* @see com.BasicAPI#TestObject(com.TestVO)
*/
@Override
public void TestObject(TestVO vo) {
System.out.println("TestObjectEx:"+vo.Id);
}
/*
* 测试TestObject传出
* @see com.BasicAPI#TestObject()
*/
@Override
public TestVO TestObject() {
System.out.println("TestObjectEx Return TestVO");
TestVO vo = new TestVO();
vo.Id = 1;
vo.Title = "title";
vo.Content = "Content";
return vo;
}
/*
* 测试List<String>
* @see com.BasicAPI#TestList(java.util.List)
*/
@Override
public List<String> TestList(List<String> list) {
System.out.println("TestList:"+list.get(0));
list.add("addOne");
return list;
}
/*
* 测试String[]
* @see com.BasicAPI#TestArray(java.lang.String[])
*/
@Override
public String[] TestArray(String[] strArray) {
System.out.println("TestArray:"+strArray[0]);
strArray[0] = "Change Form Server";
return strArray;
}
}
代码说明:
a). 关于服务端的配置请参照上篇文章:http://www.cnblogs.com/over140/archive/2010/07/30/1788563.html。
四、客户端(Android)
HessianProxyFactory factory = new HessianProxyFactory();
try {
factory.setDebug(true);
factory.setReadTimeout(1000);
BasicAPI basic = (BasicAPI)factory.create(BasicAPI.class, url,getClassLoader());
//Hello World
//Toast.makeText(this, "调用结果:"+basic.hello(), Toast.LENGTH_LONG).show();
//测试中文字符传输
// Toast.makeText(this, "测试中文字符:"+basic.TestChinese("中文字符!"), Toast.LENGTH_LONG).show();
//测试对象传入
// TestVO vo = new TestVO();
// vo.Id= 1;
// factory.setOverloadEnabled(true);
// basic.TestObject(vo);
//测试对象传出
factory.setHessian2Reply(false);
TestVO vo = basic.TestObject();
Toast.makeText(this, "TestObject:"+vo.Title, Toast.LENGTH_LONG).show();
//测试List泛型
// List<String> list = new ArrayList<String>() ;
// list.add("1个元素");
// factory.setHessian2Reply(false);
// list = basic.TestList(list);
// Toast.makeText(this, "TestObject:"+list.size(), Toast.LENGTH_LONG).show();
//测试Hashmap
// HashMap map = new HashMap();
// map.put("abc", "123");
// map = basic.TestHashMap(map);
// Toast.makeText(this, "result:"+map.get("result"), Toast.LENGTH_LONG).show();
//测试数组
// String[] strArray = new String[]{"Send To Server"};
// factory.setHessian2Reply(false);
// strArray = basic.TestArray(strArray);
// Toast.makeText(this, "TestArray:"+strArray[0], Toast.LENGTH_LONG).show();
} catch (MalformedURLException e) {
e.printStackTrace();
}
代码说明:
a). 客户端的文章也请参照上篇文章。
b). 这里就在一个函数里面测试的,分别解注测试即可,这里例子全部测试通过。
c). 需要特别注意String[]、List<String>以及TestVO的传出,需要加上"factory.setHessian2Reply(false);"这行代码,否则Android客户端传入到Java服务端没有问题,但是服务端返回客户端就报错,诸如0x75之类的错误。
d). 另外如果有函数重载的话需要设置"factory.setOverloadEnabled(true);"。这里TestObject()这个地方并没有设置,也能调用成功,但是TestObject(TestVO vo)就必须设置了,这里猜想是不是有默认行为。
维护
2011-1-8
在数据量较多的情况下(上百上千条)使用二维字符串数组效率较高,对象数组、XML串、JSON效率都较低,注意部署时把“factory.setDebug(true);”去掉或设置为false!
2011-5-20
在调试的情况下,如果上传的数据量较大(超过100条)可能引发异常,但是去掉调试又能正常运行,找不到原因,所以建议调试的时候把上传的数据量改小,分批上传,发布的时候可以改大。