当前位置:  编程技术>综合
本页文章导读:
    ▪CString::GetLength()获得字节数的正确方法介绍      前段时间,做http协议上传文件及断点续传控件时,在客户端采用C++调用CHttpConnection、CHttpFile进行文件上传。移植到Unicode编码时,上传得到的文件总是小于正常文件。最终发现问题出在CS.........
    ▪[android_gallery_4.0]gallery主要类介绍(一)                 继续上篇,本篇介绍gallery的主要类。 3.1.1 Gallery gallery的主程序类。 其类图如下。 相关类说明 1)GalleryActionBar 用于在相册主界面出现的排序下拉框,如下.........
    ▪struts-json-plugin处理"yyyy-MM-dd'T'HH:mmss"格式问题解决      一般我们在服务端中使用struts-json-plugin编码,在客户端使用net.sf.json-lib解码, 虽然这两个组件都是用的是json协议,但是在转换的时候,会遇到一些问题,比如说列表类型,还有下面要说到的.........

[1]CString::GetLength()获得字节数的正确方法介绍
    来源: 互联网  发布时间: 2013-11-10

前段时间,做http协议上传文件及断点续传控件时,在客户端采用C++调用CHttpConnection、CHttpFile进行文件上传。移植到Unicode编码时,上传得到的文件总是小于正常文件。最终发现问题出在CString::GetLength()方法上。当采用Unicode编码时,而且http header字符串中出现了中文或其其他多字节字符,该方法仍旧只返回字符数,而不是实际的字节数,这样在http header中的信息会比实际的少,导致http发送的数据小于预期的。

按照MSDN的说吗,在选用MBCS多字节字符串编码时,该方法会得到正确的字节数。此时没有问题。

 

For multibyte character sets (MBCS), GetLength counts each 8-bit character; that is, a lead and trail byte in one multibyte character are counted as two bytes.

 

但是在Unicode编码下,一旦出现中文字符,该方法就会少统计。

我试用最多的解决方法是:

CString str("abc我");
DWORD le0 = str.GetLength(); // 返回4,不是想要的字节数
// 这样处理就对了。先用CStringA类转化成多字节字符串。
le0 = CStringA(str).GetLength();


另外,也有人这样用,也可以。比上面效率高。

 

DWORD le0 = str.GetLength() * sizeof(TCHAR);

 

这种用法在MBCS环境下可以省略。在Unicode下,所有字符(包括ascii及中文字符), 每个字符都被定义为WHAR, 即双字节Unicode字符。该方法也正确。

作者:Heaven13483 发表于2013-1-11 23:03:36 原文链接
阅读:28 评论:0 查看评论

    
[2][android_gallery_4.0]gallery主要类介绍(一)
    来源: 互联网  发布时间: 2013-11-10
           继续上篇,本篇介绍gallery的主要类。
3.1.1 Gallery

gallery的主程序类。

其类图如下。

相关类说明
1)GalleryActionBar
用于在相册主界面出现的排序下拉框,如下。

3.1.2 AbstractGalleryActivity

实现基本的activity操作的类,作为某些类的基类。
其类图如下。

相关类说明
1)GalleryActivity
接口类,主要是一些获取AbstractGalleryActivity成员变量的方法。
public interface GalleryActivity extends GalleryContext {
public StateManager getStateManager();
public GLRoot getGLRoot();
public PositionRepository getPositionRepository();
public GalleryApp getGalleryApplication();
public GalleryActionBar getGalleryActionBar();
}
public interface GalleryContext {
public ImageCacheService getImageCacheService();
public DataManager getDataManager();

public Context getAndroidContext();

public Looper getMainLooper();
public Resources getResources();
public ContentResolver getContentResolver();
public ThreadPool getThreadPool();
}
2)StateManager
其负责管理activity的各种状态的启动挂起等。
通过管理一个栈,来维护所有activity的显示状态。
private Stack<StateEntry> mStack = new Stack<StateEntry>();
同时保存一个GalleryActivity的mcontext,用来方便对相应activity进行操作。
一般通过如下来启动一个activity。
mActivity.getStateManager().startState(ManageCachePage.class, data);
其相当于
context.startActivity()
或是通过如下启动一个需要处理结果的activity。
mActivity.getStateManager().startStateForResult(
PhotoPage.class, REQUEST_PHOTO, data);
其相当于
context.startActivityForResult()
以下是类图。

一个activity对应着多个显示状态。见如下定义。
private Stack<StateEntry> mStack = new Stack<StateEntry>();
private static class StateEntry {
public Bundle data;
public ActivityState activityState;

public StateEntry(Bundle data, ActivityState state) {
this.data = data;
this.activityState = state;
}
}
而显示状态通过StateEntry中的ActivityState变量来标识。
abstract public class ActivityState {
public static final int FLAG_HIDE_ACTION_BAR = 1;
public static final int FLAG_HIDE_STATUS_BAR = 2;
public static final int FLAG_SCREEN_ON = 3;
…}
ActivityState用于控制activity的显示模式,是否需要点亮显示、是否需要显示状态栏、是否需要显示动作按钮。

3)GLRootView
实现绘图的类。其类图如下。

小贴士
1)GLSurfaceView介绍
GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。

使用GLSurfaceView
通常会继承GLSurfaceView,并重载一些和用户输入事件有关的方法。如果你不需要重载事件方法,GLSurfaceView也可以直接使用, 你可以使用set方法来为该类提供自定义的行为。例如,GLSurfaceView的渲染被委托给渲染器在独立的渲染线程里进行,这一点和普通视图不一 样,setRenderer(Renderer)设置渲染器。

初始化GLSurfaceView
初始化过程其实仅需要你使用setRenderer(Renderer)设置一个渲染器(render)。当然,你也可以修改GLSurfaceView一些默认配置。
* setDebugFlags(int)
* setEGLConfigChooser(boolean)
* setEGLConfigChooser(EGLConfigChooser)
* setEGLConfigChooser(int, int, int, int, int, int)
* setGLWrapper(GLWrapper)

定制android.view.Surface
GLSurfaceView默认会创建像素格式为PixelFormat.RGB_565的surface。如果需要透明效果,调用 getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface的像 素格式都是32位,每个色彩单元都是8位深度,像素格式是设备相关的,这意味着它可能是ARGB、RGBA或其它。

选择EGL配置
Android设备往往支持多种EGL配置,可以使用不同数目的通道(channel),也可以指定每个通道具有不同数目的位(bits)深度。因此, 在渲染器工作之前就应该指定EGL的配置。GLSurfaceView默认EGL配置的像素格式为RGB_656,16位的深度缓存(depth buffer),默认不开启遮罩缓存(stencil buffer)。
如果你要选择不同的EGL配置,请使用setEGLConfigChooser方法中的一种。

调试行为
你可以调用调试方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)来自定义 GLSurfaceView一些行为。在setRenderer方法之前或之后都可以调用调试方法,不过最好是在之前调用,这样它们能立即生效。

设置渲染器
总之,你必须调用setRenderer(GLSurfaceView.Renderer)来注册一个GLSurfaceView.Renderer渲染器。渲染器负责真正的GL渲染工作。

渲染模式
渲染器设定之后,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)还是连续(continuous)。默认是连续渲染。

Activity生命周期
Activity窗口暂停(pause)或恢复(resume)时,GLSurfaceView都会收到通知,此时它的onPause方法和 onResume方法应该被调用。这样做是为了让GLSurfaceView暂停或恢复它的渲染线程,以便它及时释放或重建OpenGL的资源。

事件处理
为了处理事件,一般都是继承GLSurfaceView类并重载它的事件方法。但是由于GLSurfaceView是多线程操作,所以需要一些特殊的处 理。由于渲染器在独立的渲染线程里,你应该使用Java的跨线程机制跟渲染器通讯。queueEvent(Runnable)方法就是一种相对简单的操 作,例如下面的例子。
class MyGLSurfaceView extends GLSurfaceView {

private MyRenderer mMyRenderer;

public void start() {
mMyRenderer = ...;
setRenderer(mMyRenderer);
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
queueEvent(new Runnable() {
// 这个方法会在渲染线程里被调用
public void run() {
mMyRenderer.handleDpadCenter();
}});
return true;
}
return super.onKeyDown(keyCode, event);
}
}

(注:如果在UI线程里调用渲染器的方法,很容易收到“call to OpenGL ES API with no current context”的警告,典型的误区就是在键盘或鼠标事件方法里直接调用opengl es的API,因为UI事件和渲染绘制在不同的线程里。更甚者,这种情况下调用glDeleteBuffers这种释放资源的方法,可能引起程序的崩溃, 因为UI线程想释放它,渲染线程却要使用它。)

2)GLSurfaceView的非交互使用

使用GLSurfaceView开发3D应用时,如果是非交互式的应用,可以直接使用GLSurfaceView。如果需要交互式的行为,则需要继承
GLSurfaceView并重写一些方法。交互式应用示例见下篇。

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.provider.OpenableColumns;
/**
* 本示例演示OpenGL ES开发3D应用
* 该Activity直接使用了GLSurfaceView
* 这是因为GLSurfaceView可以直接使用,除非需要接受用户输入,和用户交互,才需要重写一些GLSurfaceView的方法
* 如果开发一个非交互式的OpenGL应用,可以直接使用GLSurfaceView。参照本示例
* @author Administrator
*
*/
public class NonInteractiveDemo extends Activity {

private GLSurfaceView mGLView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mGLView = new GLSurfaceView(this);
//这里需要指定一个自定义的渲染器
mGLView.setRenderer(new DemoRenderer());
setContentView(mGLView);

}


public void onPause(){
super.onPause();
mGLView.onPause(); //当Activity暂停时,告诉GLSurfaceView也停止渲染,并释放资源。
}

public void onResume(){
super.onResume();
mGLView.onResume(); //当Activity恢复时,告诉GLSurfaceView加载资源,继续渲染。
}




}
class DemoRenderer implements Renderer{
@Override
public void onDrawFrame(GL10 gl) {
//每帧都需要调用该方法进行绘制。绘制时通常先调用glClear来清空framebuffer。
//然后调用OpenGL ES其他接口进行绘
    
[3]struts-json-plugin处理"yyyy-MM-dd'T'HH:mmss"格式问题解决
    来源: 互联网  发布时间: 2013-11-10
一般我们在服务端中使用struts-json-plugin编码,在客户端使用net.sf.json-lib解码,
虽然这两个组件都是用的是json协议,但是在转换的时候,会遇到一些问题,比如说列表类型,还有下面要说到的日期类型。

struts-json-plugin编码日期类型一般编码为"yyyy-MM-dd'T'HH:mmss"(例如2012-10-09T17:28:32),而net.sf.json-lib一般编码成毫秒的长整型表示,因此要使两方能够协作编解码的话,要么改变struts-json-plugin的格式(不可行,因为文档上说得明白,只能使用SimpleDateFormatter的格式),要么改变json-lib的格式,只需要在解码json字符串前加上一句即可:
JSONUtils.getMorpherRegistry().registerMorpher(newDateMorpher(new String[] {"yyyy-MM-dd't'HH:mm:ss"}),false);
SomeCls obj =(SomeCls)JSONObject.toBean(JSONObject.fromObject(someStr), SomeCls.class);

另外,对于列表类型,需要注册类型:
Map classMap = new HashMap();
classMap.put("SomeCls2", SomeCls2.class);
SomeCls obj =(SomeCls)JSONObject.toBean(JSONObject.fromObject(someStr), SomeCls.class,classMap);
作者:jintonghuoya 发表于2013-1-11 22:43:27 原文链接
阅读:45 评论:1 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


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

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

浙ICP备11055608号-3