当前位置:  编程技术>移动开发
本页文章导读:
    ▪Hessian实战施用之设置Hessian报文头信息        Hessian实战应用之设置Hessian报文头信息  使用Hessian中,在Java模拟客户端的时候可能存在需要向Hessian报文头信息设置一些参数,如token信息。默认的HessianProxyFactory对没有方法设置报文头的方.........
    ▪ String与InputStream互相转换        String与InputStream相互转换 1.String to InputStream   String str = "String与InputStream相互转换";   InputStream   in_nocode   =   new   ByteArrayInputStream(str.getBytes());   InputStream   in_withcode   =   new   ByteArrayInp.........
    ▪ PreloadDataCache数据缓存应用       PreloadDataCache数据缓存使用 PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强   Java   1 2 3 4 5 6 7 8 9 publicclassRemoveTypePriorityHigh<T>im.........

[1]Hessian实战施用之设置Hessian报文头信息
    来源: 互联网  发布时间: 2014-02-18
Hessian实战应用之设置Hessian报文头信息

 使用Hessian中,在Java模拟客户端的时候可能存在需要向Hessian报文头信息设置一些参数,如token信息。默认的HessianProxyFactory对没有方法设置报文头的方法。以下方法可以做到。

1.新建自己的HessianProxyFactory继承com.connection.ForwardHessianConnectionFactory

/**
 * 接口调用的HessianConnectionFactory
 * 重写Hessian的HessianURLConnectionFactory向报文头添加接入端的控制信息
 * 
 * @author ZhangMingxue
 * @version 1.0
 * @time 2013下午04:49:30
 * @JDK 1.6
 */
public class ForwardHessianConnectionFactory extends
		HessianURLConnectionFactory {

	// 报文头参数
	private Map<String, String> headerParamMap = null;

	/**
	 * 报文头参数,通过构造方法传入
	 * 
	 * @param headerParamMap
	 */
	public ForwardHessianConnectionFactory(Map<String, String> headerParamMap) {
		this.headerParamMap = headerParamMap;
	}

	@Override
	public HessianConnection open(URL url) throws IOException {
		HessianURLConnection hessianURLConnection = (HessianURLConnection) super
				.open(url);

		if (null != headerParamMap && !headerParamMap.isEmpty()) {
			Set<String> keySet = headerParamMap.keySet();
			for (String key : keySet) {
				// 向报文头中添加参数
				hessianURLConnection.addHeader(key, headerParamMap.get(key));
			}
		}
		return hessianURLConnection;
	}

}

 2.创建HessianProxyFactory

	/**
	 * 创建HessianProxyFactory
	 * 
	 * @param jsc
	 * @return
	 */
	public HessianProxyFactory createHessianProxyFactory(JavaSamplerContext jsc) {
		HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
		// Request的Header设置参数
		Map<String, String> headerParamMap = addRequestHeaderParams(jsc);
		// 创建自己的HessianConnectionFactory
		HessianConnectionFactory hessianConnectionFactory = new ForwardHessianConnectionFactory(
				headerParamMap);
		hessianConnectionFactory.setHessianProxyFactory(hessianProxyFactory);
		hessianProxyFactory.setConnectionFactory(hessianConnectionFactory);
		return hessianProxyFactory;
	}

  

/**
	 * 接口接用请求转发
	 * 
	 * @param jsc
	 * @return
	 */
	public Map<String, String> addRequestHeaderParams(JavaSamplerContext jsc) {
		Map<String, String> headerParamMap = new HashMap<String, String>();
		headerParamMap.put("xxxxx1", jsc.getParameter("id"));
		headerParamMap.put("xxxxx2", jsc.getParameter("authToken"));
		return headerParamMap;
	}

 3.客户端使用自己的HessianProxyFactory,获取远程接口。

 

public IPropose buildRemoterServer(JavaSamplerContext jsc) {
		HessianProxyFactory hessianProxyFactory = createHessianProxyFactory(jsc);
		IPropose iPropose = null;
		try {
			StringBuffer url = createServerURL(jsc,
					"xxx.xxx.xxxx.xxxxServlet");
			iPropose = (IPropose) hessianProxyFactory.create(IPropose.class,
					url.toString());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		return iPropose;
	}

 

@Override
public SampleResult runTest(JavaSamplerContext jsc) {
	SampleResult result = new SampleResult();
	result.sampleStart();
	try {
		IPropose iPropose = buildRemoterServer(jsc);
		Object bo = iPropose.createPl();//调用远程服务器方法
		result.sampleEnd();
	} catch (Exception e) {
		result.setSuccessful(false);
		result.setResponseMessage(e.getMessage());
		e.printStackTrace();
	}
	return result;
}

 以上的JavaSamplerContext对象可以简单理解为Map类型的参数,由jmeter测试工具创建,主要用于存放测试的参数,根Hessian没有关系,主要是我的客户端是Jmeter,如果是客户端采用的是其它技术可以把JavaSamplerContext换成Map.


    
[2] String与InputStream互相转换
    来源: 互联网  发布时间: 2014-02-18
String与InputStream相互转换

1.String to InputStream

 

String str = "String与InputStream相互转换";

 

InputStream   in_nocode   =   new   ByteArrayInputStream(str.getBytes());  
InputStream   in_withcode   =   new   ByteArrayInputStream(str.getBytes("UTF-8"));  

 

 

 

 

 

 

 

2.InputStream to String

 

    这里提供几个方法。

 

方法1:

 

  public String convertStreamToString(InputStream is) {   

 

   BufferedReader reader = new BufferedReader(new InputStreamReader(is));   

 

        StringBuilder sb = new StringBuilder();   

 

    

 

        String line = null;   

 

        try {   

 

            while ((line = reader.readLine()) != null) {   

 

                sb.append(line + "/n");   

 

            }   

 

        } catch (IOException e) {   

 

            e.printStackTrace();   

 

        } finally {   

 

            try {   

 

                is.close();   

 

            } catch (IOException e) {   

 

                e.printStackTrace();   

 

            }   

 

        }   

 

    

 

        return sb.toString();   

 

    }   

 

 

 

方法2:

 

public   String   inputStream2String   (InputStream   in)   throws   IOException   {
        StringBuffer   out   =   new   StringBuffer();
        byte[]   b   =   new   byte[4096];
        for   (int   n;   (n   =   in.read(b))   !=   -1;)   {
                out.append(new   String(b,   0,   n));
        }
        return   out.toString();

 

方法3:
public   static   String   inputStream2String(InputStream   is)   throws   IOException{
        ByteArrayOutputStream   baos   =   new   ByteArrayOutputStream();
        int   i=-1;
        while((i=is.read())!=-1){
        baos.write(i);
        }
       return   baos.toString();
}

 


    
[3] PreloadDataCache数据缓存应用
    来源: 互联网  发布时间: 2014-02-18
PreloadDataCache数据缓存使用
PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强

本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能。Android图片内存缓存可见ImageCache。

 

主要特性:(1).使用简单  (2).可自动预取新数据  (3).可选择多种缓存算法(包括FIFO、LIFO、LRU、MRU、LFU、MFU等15种)或自定义缓存算法  (4).省流量性能佳(有且仅有一个线程获取数据)  (5).支持不同类型网络处理  (6)缓存可序列化到本地  缓存可从文件中恢复  (7).扩展性强  (8). 包含map的大多数接口

 

适用:Java和Android开发中获取数据较耗时的应用,如网络通讯、响应慢数据获取,在类似网易新闻、花瓣这类应用中可以起到很好的效果。对于图片缓存可直接使用ImageCache。

 

1、使用

引入TrineaAndroidCommon@Github或TrineaAndroidCommon@GoogleCode作为你项目的library,或是自己抽取其中的PreloadDataCache@Git或PreloadDataCache@GoogleCode部分使用。

测试场景:获取每个数据需用时2秒,10次获取的场景效果对比,缓存前用时(ms):20004,缓存后用时(ms):4026。缓存命中率为80%。实例代码如下:

从上面的代码中缓存定义部分可以看出,只需要定义PreloadDataCache,并设置获取数据的接口setOnGetDataListener,以后使用get获取数据即可。

 

2、功能介绍
(1) 初始化缓存
可以使用以下四种方式之一初始化缓存
PreloadDataCache()
PreloadDataCache(int)
PreloadDataCache(int, int)
loadCache(String) 从文件中恢复缓存
支持缓存大小和获取数据线程池大小的设置,默认缓存大小为SimpleCache#DEFAULT_MAX_SIZE,默认线程池大小根据系统Cpu个数设置。

 

(2)、设置数据获取方式
public void setOnGetDataListener(OnGetDataListener<K, V> onGetDataListener)
设置数据获取的方式。缓存通过该接口获取数据及预取数据。

 

(3) 获取及预取数据
public CacheObject<V> get(K key, List<K> keyList) get某个key(同步),并且会根据key在keyList中的顺序自动向前或向后获取新数据进行缓存
public CacheObject<V> get(K key) get某个key(同步),但不会自动获取新数据进行缓存
public void setForwardCacheNumber(int forwardCacheNumber) 向前预取数据个数设置,默认为PreloadDataCache#DEFAULT_FORWARD_CACHE_NUMBER

public void setBackwardCacheNumber(int backwardCacheNumber)向后预取数据个数设置默认,默认为PreloadDataCache#DEFAULT_BACKWARD_CACHE_NUMBER

 

(4)、设置缓存算法
public void setCacheFullRemoveType(CacheFullRemoveType<V> cacheFullRemoveType)
设置缓存算法,缓存算法即为缓存满时为了插入新数据,删除旧数据的规则。

 

目前包括FIFO、LIFO、LRU、MRU、LFU、MFU、优先级低先删除、优先级高先删除、数据小先删除、数据大先删除、图片小先删除、图片大先删除、文件小的先删除、文件大的先删除、永不删除。还可以通过实现CacheFullRemoveType来自定义缓存算法。。默认为RemoveTypeEnterTimeFirst,即先进先出。下面为详细介绍

RemoveTypeEnterTimeFirst FIFO先进先出,先进入先删除
RemoveTypeEnterTimeLast LIFO后进先出,后进入先删除
RemoveTypeLastUsedTimeFirst LRU(Least Recently User),最先使用先删除
RemoveTypeLastUsedTimeLast MRU(Most Recently Used),最近使用先删除
RemoveTypeUsedCountSmall LFU(Least Frequently Used),使用频率低先删除
RemoveTypeUsedCountBig MRU(Most Frequently Used),使用频率高先删除
RemoveTypePriorityLow 优先级低先删除
RemoveTypePriorityHigh 优先级低先删除
RemoveTypeDrawableSmall 图片小的先删除
RemoveTypeDrawableLarge 图片大的先删除

RemoveTypeFileSmall 文件小的先删除

RemoveTypeFileLarge 文件大的先删除
RemoveTypeDataBig 数据大先删除,根据缓存数据的compareTo函数决定
RemoveTypeDataSmall 数据小先删除,根据缓存数据的compareTo函数决定
RemoveTypeNotRemove 不删除,缓存满时不再允许插入新数据

 

自定义缓存算法只需要实现CacheFullRemoveType的compare方法即可。比较结果小于0表示会被先删除

 

(5)、优化数据读取
a. 设置数据读取http超时
public void setHttpReadTimeOut(int httpReadTimeOut)
若httpReadTimeOut小于0表示不设置超时,默认不设置,单位为毫秒

b. 设置无网络不读取
public void setContext(Context context)
设置context,网络连接失败不会新建线程请求数据。

c. 支持不同网络类型的处理
public void setAllowedNetworkTypes(int allowedNetworkTypes)
设置允许的网络类型,可选择PreloadDataCache#NETWORK_MOBILE、PreloadDataCache#NETWORK_WIFI或两者都允许。默认两者都允许。
注意:这个接口生效必须先setContext(Context context)

 

(6)、缓存元素有效时间
public void setValidTime(long validTime)
设置缓存元素有效时间,小于0表示不会失效,此时仅根据CacheFullRemoveType在缓存满时替换元素
通过protected boolean isExpired(K key)判断某key是否过期

 

(7)、缓存命中率
getHitRate()、getHitCount()、getMissCount()分别表示缓存命中率、命中次数、未命中次数

 

(8) 序列化
序列化需要缓存数据类型支持Serializable,关于序列化可参考Java Serializable的理解和总结

使用loadCache(String)从文件中恢复缓存
saveCache(String, SimpleCache)保存缓存到文件

 

(9)、其他与map类似接口
public boolean containsKey(K key) 缓存中是否包含该key
public CacheObject<V> remove(K key) 从缓存中删除某个key
public void clear() 清空缓存
public Set<K> keySet() 缓存中key集合
public Set<Map.Entry<K, CacheObject<V>>> entrySet() 缓存中key,value键值对集合
public Collection<CacheObject<V>> values() 缓存中元素集合
public CacheObject<V> put(K key, V value) 手动插入某个元素
public CacheObject<V> put(K key, CacheObject<V> value) 手动插入某个元素
public CacheObject<V> get(K key) 得到某个key
public int getSize() 得到缓存中有效元素个数
public int getMaxSize() 得到缓存中元素最大个数

 

(10)得到设置
上面的set几乎都可以通过对应的get得到相应value
使用getOnGetDataListener()得到获取数据的方法
getForwardCacheNumber()得到自动向前缓存的个数
getBackCacheNumber()得到自动向后缓存的个数
getMaxSize()得到缓存最大容量
getValidTime()得到有效时间,以毫秒计
getCacheFullRemoveType()得到cache满时删除元素类型


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3