小编mWi*_*lis的帖子

为什么java.text.DateFormat在Android上为en_US和en_GB返回相同的日期格式?

我有一个小的Android应用程序,我用它来根据语言环境以不同的格式打印特定的日期.

这是我的代码(使用java.text.DateFormat):

Locale[] locales = {new Locale("en", "US"), new Locale("en", "GB"), new Locale("en", "AU"), new Locale("en", "NZ"), new Locale("en", "ZA")};
for(int i = 0; i < locales.length; ++i) {
    Log.d(logKey, locales[i].toString() + " - " + DateFormat.getDateInstance(DateFormat.SHORT, locales[i]).format(Calendar.getInstance().getTime()));
}
Run Code Online (Sandbox Code Playgroud)

因此,LogCat中的输出是:

D/FormatPoC(  390): en_US - 4/27/12
D/FormatPoC(  390): en_GB - 4/27/12
D/FormatPoC(  390): en_AU - 4/27/12
D/FormatPoC(  390): en_NZ - 4/27/12
D/FormatPoC(  390): en_ZA - 4/27/12
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 - 为什么所有这些都一样?在Java SE中,我得到:

en_US - 4/27/12
en_GB - 27/04/12
en_AU - 27/04/12 …
Run Code Online (Sandbox Code Playgroud)

java android locale date-format

10
推荐指数
1
解决办法
1767
查看次数

是否有正确的方法来测试用户提供的SQLCipher密码在Android上是否有效?

我正在使用SQLCipher for Android,我正在尝试确定测试用户提供的密码是否有效的正确方法.

我的第一个倾向是尝试使用给定的密码打开数据库,使用SQLCipher实现SQLiteOpenHelper.getReadableDatabase(password),然后捕获SQLiteException弹出的数据库.

这确实有效,但问题是因为Android API实际上包含了底层的C调用,它为你做了很多工作 - 特别是当你使用Android API打开数据库时,它会打开数据库,运行本机C级sqlite3_key方法(使用提供的密码),然后尝试在数据库上设置区域设置,无论提供的密码是否正确.

此时,Android库尝试设置区域设置,底层数据库抛出"加密或不是数据库" SQLiteException,它被捕获并重新抛出; 但在此之前,会将无关的错误写入日志,实质上是说无法设置区域设置并且数据库正在关闭(包含堆栈跟踪).因为这是由Android库专门编写的,所以我无法抑制它,在日志中留下一个实际上与我原来的问题无关的丑陋错误,这只是我传入了错误的密码.

因为Android库不公开C级调用,所以我不能只使用SQLCipher API文档中描述的关于测试密钥的方法,因为我没有权限直接打开数据库.

我倾向于使用SQLiteDatabaseHook,但最好的我能说,这排除了我的使用SQLiteOpenHelper,这似乎没有提供设置钩子的方法.

有没有其他人知道更好的方法来测试输入密码是否通过SQLCipher Android API正确解密SQLCipher数据库?我完全希望调用一个方法并检查抛出的异常 - 我不想要的是操作尝试在数据库上执行无关的处理(如set locale)并在我的日志中写入一个完全不可抑制的错误.

android sqlcipher

7
推荐指数
1
解决办法
1746
查看次数

Mac浏览器似乎吞下了初始的CORS XHR预检请求

我有一个非常简单的启用CORS的Node.js Web服务器在我办公室的另一台机器上运行.我设置它在端口8080上运行.

如果我发送它作为初始请求,触发预检(例如具有内容类型的请求application/json),它将失败,但仅在非常特定的条件下:

  1. 服务器在端口80或8080上运行.任何其他端口工作正常.
  2. 我正在从Mac发送请求(OS X 10.8.5).无论我是在本地计算机上运行服务器还是在单独的Windows计算机上运行,​​都会产生相同的效果.如果我在我的Mac上运行服务器并从我的Windows机器发出请求,它可以正常工作.

这是我用来发送请求的代码:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://myserver.domain.com'); // NOT the real URL of course...
xhr.setRequestHeader('Content-Type', 'application/json'); // Triggers the preflight OPTIONS request.
xhr.send();
Run Code Online (Sandbox Code Playgroud)

非常简单.没有花里胡哨,但出于某种原因,如果我在Mac上运行该请求,浏览器似乎会在发送之前吞下OPTIONS请求.我没有收到服务器收到的任何迹象,浏览器控制台显示(相对无用)错误.所有三种主要浏览器(Chrome,Safari和Firefox)都显示相同的行为.

其他拥有类似Mac的同事也尝试了相同的结果,因此它似乎并不特定于我的机器.

我认为这可能是我的服务器的一个问题,因为我对一个着名的CORS启用的API服务器(即api.github.com)尝试了同样的方法,并且工作得很好.但是,我在本地针对2个完全不同的服务器应用程序运行它,结果相同.

CORS响应头看起来很好 - 正如我所说,如果我从Windows浏览器发送请求,它的工作正常.此外,如果我最初发送非预先请求的请求,后续的预检请求也可以正常工作.

我认为在"localhost"或"127.0.0.1"上运行服务器或客户端可能是一个问题,但我也使用它们的主机名运行两个结果相同.

没有涉及SSL,一切都是通过HTTP明文.

有没有人见过这种行为,特定于Mac浏览器?

javascript macos xmlhttprequest cors

6
推荐指数
1
解决办法
1118
查看次数

为什么我的Android应用程序在不同的操作系统版本上分配了大量不同的内存?

我有一个非常简单的Android应用程序,包含一个Activity,带有一些文本框和一些处理代码.

当我在2.3设备上安装并首次打开它时,它会分配~2.7MB的内存(根据Eclipse DDMS中的Heap update选项卡).

在3.1设备上,它分配~6.1MB.

在4.0设备上,它分配~13.8MB.

我在3之间没有进行任何代码更改,这些措施是在初始安装/打开应用程序时采取的(因此它没有时间进行任何泄漏).它不使用任何图像,也没有专门启用硬件加速.

有谁知道为什么脚印可能会有这么大差异?我认为它与操作系统版本的差异有关,但我想知道是否有人知道这些差异可能是什么.

我已经读过有关从3.0开始的位图分配的变化导致分配的内存明显增加,但我的应用程序不使用任何图像.它只包含一些EditText字段和TextViews.

android memory-management

5
推荐指数
1
解决办法
238
查看次数