blog of faywong

love coding, love life


  • 首页

  • 关于

  • 归档

  • 标签

Android 4.2.2上WebView.loadUrl带来软键盘自动收起的问题

发表于 2017-06-03 |

今天由测试同学反映两款手机(红米,三星GS4,均搭载Android 4.2.2)存在WebApp中收到回调后软键盘自动收起。

经过一段时间的研究,发现在Android 4.2.2上WebView.loadUrl()被调用后WebView会认为新的一个页面即将打开,而将软键盘收起。

android填坑之旅还要继续……

Android L上WebView的行为变得更严格

发表于 2017-06-03 |

android 5.0上WebView开始默认阻止Mixed Content,且不再接受第三方的cookie。所以为了你以往的WebApp里边的内容可以正常访问,需要使用WebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW) 和CookieManager.setAcceptThirdPartyCookies({your_webview}, true) 来放开这一限制。

当然最好是让你的页面不再存在mixed content,不再依赖第三方cookie最为完美。

黑暗WebView@HuaweiMediaPad X1 C208B011

发表于 2017-06-03 |

最近遇到了一位很热心的用户,反映C208B011版本的Huawei X1(想想MediaPad系列本人几年前在华为也曾参与研发)上无法使用一个WebApp。debug后发现在该系统的WebView内的JS里无法使用console.log()导致严重的java-js之间的通信机制缺失。特意为其创建一个BridgePolicy类来维护之,若是该款机器,则切换至window.alert来实现java-js之间的通信,否则则使用console.log()。

测试发现该机器的C208B009版本的WebView并无此问题(且与硬件,基带是3G或4G均无关)。

第一次face to face面对我们的用户感触颇多,一个产品对于他们家里的人是如此重要,一个WebApp不能用又如此大程度的影响到他,因为存在这个问题甚至想换掉这部手机。

用户对于解决问题的意愿极强。他(40岁左右的大叔)多次上Huawei X1论坛与其他用户交流看法和规律,寻求解决方案,为此去了解该机器的CPU,基带,ROM版本……。

幸运的是,他们使用的是我们这个首屈一指的互联网公司的产品,遇到了我们这样的团队,得以面对面的反映他遇到的问题——没有抱怨,而是尽可能为我们提供他“调查”,“摸索”出来的规律。

[pgsql]仅当主key不存在时插入记录

发表于 2017-06-03 |

比如创建一个用户时只有在不存在的时候才需要插入,查了好久,终于搞明白:

INSERT INTO users(id, alias, email) SELECT 00001, 'faywong', 'wangfei584521@163.com' from users WHERE NOT EXISTS (SELECT * FROM users WHERE id = 00001)

pqsql在这点上真叫一个繁琐!

clojure map-indexed使用实例

发表于 2017-06-03 |

用了clojure,才发现北方有一座高山……

今天网站中需要做一个小功能,通过restful api请求另外一个内部网站的数据,但是写这个网站的同学给出的数据是[[a b c] [d e f]…]另外还有一个用于代表每一项的链接的links: [link1 link2 link3…]

需要将之每项对应合并起来,找了下发现map-indexed非常适合这个场景:

(def test1 [['a ] ['b] ['c]])
(def test2 ['c 'd 'e])
(defn my-merge [vect1 vect2]
(into [] (map-indexed
(fn [idx item] (merge item (vect2 idx))) vect1)))
(my-merge test1 test2)
=>[[a c] [b d] [c e]]

Nosql in postgresql

发表于 2017-06-03 |

PostgrepSQL 9.4开始支持了jsonb数据类型,从而支持了一部分nosql特性。今天使用了下,简要记录下:

记得在pgadmin中验证下postgresql的版本号:

SELECT version();

确认是9.4以上。

确认之后可以在SQL终端继续感受下:

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;

创建一个jsonb类型的字段:

CREATE TABLE mobile_analysis
(id serial PRIMARY KEY,
datadoc jsonb,
create_at TIMESTAMP WITH TIME ZONE default current_timestamp);

其中datadoc是我想存为json格式的字段的名称,为了支持后续的检索,为其创建索引:

CREATE INDEX idx_mobile_analysis ON mobile_analysis USING gin (datadoc jsonb_path_ops);

其中的jsonb_path_ops是为了支持对jsonb字段的值进行检索,条件过滤(比如包含有特定的key-value对的记录)所必需的。

插入一条测试数据:

INSERT INTO mobile_analysis(datadoc)
VALUES ('{"a": 1, "b":2, "d": "string_val"}');

通过包含条件查询之:

SELECT * FROM mobile_analysis WHERE datadoc @> '{"a":1}'

更多的关于json/jsonb类型的函数和操作符的资料请见这里。

以UTF-8编码建立postgresql数据库

发表于 2017-06-03 |

因为要与java后端协作,数据库得建成UTF-8编码的。折腾了半天,实在是没有办法,改了locale,重新安装postgresql-server,最终通过命令行指定编码和模板(这点很重要)这样蒙混过关:

命令行:

createdb --locale=en_US.utf8 --encoding=UTF8 --template=template0 test_db

然后确认下:

psql_result

如何评估Android应用程序的帧率

发表于 2017-06-03 |

在android的开发中,我们不时需要客观的测量和评估android应用程序的帧率。这篇文章我打算分享下这几天我在这方面的尝试:

1) fps meter

这个软件是我使用最早的,但是对手机的要求很高。第一是root,root完毕也不是每个手机上都能很好的工作。现在小米的MIUI对于root这件事是越来越不大方了,所以也更加添加了使用的难度。

root成本高昂,root完毕仍然不一定适用于所有的手机。所以只能忽略之。

2) dumpsys

dumpsys是android系统提供的用于dump系统服务的状态信息的命令行工具。

给它提供gfxinfo参数时,它能在Logcat输出中给出UI相关的性能数据。但是M以前版本的android自带的dumpsys工具只能给出120帧的时序信息。且需要手动合并时间值。

例如systemui模块的UI方面的信息如下:

** Graphics info for pid 1269 [com.android.systemui] **
Recent DisplayList operations
DrawRenderNode
DrawRenderNode
DrawRenderNode
DrawRenderNode
DrawRenderNode
DrawRenderNode
DrawRenderNode
RestoreToCount
multiDraw
DrawText
DrawRect
DrawBitmap
DrawColor
DrawLayer
multiDraw
DrawText
multiDraw
DrawText
multiDraw
DrawText
DrawBitmap
DrawBitmap
DrawRect
DrawRect
multiDraw
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
DrawShadow
DrawRoundRect
DrawBitmap
DrawBitmap
DrawBitmap
multiDraw
DrawText
multiDraw
DrawText
DrawShadow
DrawRoundRect
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
DrawBitmap
multiDraw
DrawText
Caches:
Current memory usage / total memory usage (bytes):
TextureCache 20874472 / 75497472
LayerCache 9633792 / 50331648 (numLayers = 4)
Garbage layers 0
Active layers 0
RenderBufferCache 2019328 / 8388608
GradientCache 0 / 1048576
PathCache 631960 / 33554432
TessellationCache 219536 / 1048576
TextDropShadowCache 6289840 / 6291456
PatchCache 14272 / 131072
AssetAtlas 15745024 bytes ( 15.02 MB )
FontRenderer 0 A8 5242880 / 5242880
FontRenderer 0 RGBA 4194304 / 4194304
FontRenderer 0 total 9437184 / 9437184
Other:
FboCache 9 / 16
Total memory usage:
49120384 bytes, 46.84 MB
Profile data in ms:
StatusBar/android.view.ViewRootImpl@647809c (visibility=0)
Draw Prepare Process Execute
0.61 0.19 6.45 1.72
0.59 0.25 6.14 1.19
0.89 0.23 5.95 1.32
0.78 0.28 7.68 1.48
3.48 0.22 5.72 1.43
0.61 0.17 5.90 1.18
0.61 0.19 5.48 1.17
0.67 0.19 5.58 1.17
0.50 0.19 5.58 1.19
0.60 0.21 5.06 1.13
0.79 0.27 8.64 1.77
0.81 0.25 6.46 1.46
0.81 0.19 5.51 1.19
0.95 0.30 8.34 2.36
0.79 0.27 6.59 1.76
1.25 0.23 6.41 1.20
2.13 0.31 2.12 1.25
0.64 0.22 5.66 1.29
0.61 0.21 5.56 1.21
0.68 0.16 5.58 1.24
0.83 0.27 6.95 1.54
0.61 0.19 5.77 1.22
0.67 0.22 5.49 1.17
1.12 0.24 8.62 1.74
21.00 7.25 35.60 23.48
Heads Up/android.view.ViewRootImpl@17c714d0 (visibility=8)
Draw Prepare Process Execute
View hierarchy:
StatusBar/android.view.ViewRootImpl@647809c
691 views, 1095.36 kB of display lists
Heads Up/android.view.ViewRootImpl@17c714d0
63 views, 93.02 kB of display lists
Total ViewRootImpl: 2
Total Views: 754
Total DisplayList: 1188.38 kB

这些数据采样的时间太短,且需要进一步的加总才能可视化。所以不是很方便。

Google似乎也意识到了这一点,在M Preview中他们支持了累计的帧率数据:

Stats since: 752958278148ns
Total frames rendered: 82189
Janky frames: 35335 (42.99%)
90th percentile: 34ms
95th percentile: 42ms
99th percentile: 69ms
Number Missed Vsync: 4706
Number High input latency: 142
Number Slow UI thread: 17270
Number Slow bitmap uploads: 1542
Number Slow draw: 23342

但是适用面太窄了,只能在android M中使用。

3) GameBench

这个工具目前来看用起来很方面,且直接给出了可视化结果,非常人性化且可靠。上个截图:

GameBench

使用步骤:

  1. 下载gamebench-3.2.2p.apk并安装到 Android 手机上
  2. 下载GameBench-Installer_v4.0.jar并通过
    java -jar GameBench-Installer_v4.0.jar

在PC上运行设置过程(注意:需要使用jdk8,不然jar包会报错),直到出现以下成功界面:
GameBench PC 设置

  1. 在 android 上运行 GameBench app,并在其中运行待评估的目标应用,运行一段时间后得到如下结果:

GameBench 结果

Luminus web项目中让ajax请求和anti-forgery共存

发表于 2017-06-03 |

Luminus web项目默认会启用anti-forgery特性以防止跨站攻击,极大增强了安全性。但是也为一些异步发生(不是来源于服务端的输出页面)的请求(ajax)带来了不便。

可以如下解决之:

若你的网页模板是经由selmer layout的,它会自动带上这个anti-forgery token。你便可以在js中添加如下代码

var csrfToken = "{{csrf-token}}";
$.ajaxPrefilter(function (options, originalOptions, request) {
if (csrfToken) {
request.setRequestHeader('X-CSRF-Token', csrfToken);
}
});

Luminus框架的anti-forgery middleware也可以接受http header中的”X-CSRF-Token”指定的token。
这样子就把token给带到服务端了。让ajax请求顺利发出。

Clojure 生产环境中怎么使用environ

发表于 2017-06-03 |

environ可以很方便帮我们管理项目中的各种配置,但是最近在使用的时候遇到了一个问题,就是我在dev, test profile下配置的database-uri到打出uberjar之后就访问不到了。最后看了下源码,在生产环境下,需要通过进程环境变量或Java系统属性来完成这一目的:

进程环境变量:

DATABASE_URL=jdbc:postgres://localhost/prod java -jar standalone.jar

Java系统属性:

java -Ddatabase.url=jdbc:postgres://localhost/prod -jar standalone.jar
123…5
faywong

faywong

blog of faywong, faywong

43 日志
16 标签
© 2017 faywong
由 Hexo 强力驱动
主题 - NexT.Muse