在android开发中,有两条很重要的编程准则

  • 不要堵塞ui线程
  • 不要在非ui线程操作ui控件

开发者必须这两个遵守单线程模型的准则,将耗时的逻辑转移到非ui线程进行,得出计算结果后,通知ui线程进行数据的展现。本文介绍一下android的异步编程。

android线程模型

同hotspot vm一样,在daivlk vm中,采取的是1:1线程模型,每一个android thread对应一个Native Linux thread;linux内核通过cfs(completely fair scheduler)来进行线程调度,在cfs中着影响一个线程时间分配的因素有两个:

  • thread priority
  • thread group

thread group

线程的thread group是动态改变的,在android framework层面,android的应用有5个等级,分别是

  • foreground process
  • visible process
  • service process
  • backgroud process
  • empty process

它们的thread …


查看全文
Posted by zhengwen

android开发者在移植第三方native库时,经常会使用到jni.
Java Native Interface(java本地接口),用于java与c/c++代码进行交互.需要了解的是,jni只是jvm的一个规范,各家虚拟机有各自的实现,本文分享一下dalvik中jobject reference的实现.

jobject reference type

jni规范中,对jobject定义了两种reference类型:

  • 全局引用(global reference)
  • 局部引用(local reference)

在JNI Specification中的说明是:

Local references are valid for the duration of a native method call, and are automatically freed after the native method returns. Global references …


查看全文
Posted by zhengwen

前端时间为了科学上网买了个vps,准备用aaapei这个主域名收回来,用在vps跑一些试验性服务,blog切到二级子域名 blog.aaapei.com

最近一两个月会将aaapei.com的80端口重定向到blog子域名,顺便扯一句,godaddy的重定向服务在国内被禁,所以在vps上又跑了个tornado实例,专门做重定向;google analytics上看月pv也就几百,我一定是想多了 :<


查看全文
Posted by zhengwen

“愤怒的小鸟”中,lua脚本是运行时部署在应用的data目录,同时做了脚本加密;
但是如果你的lua脚本有了模块包,脚本就会有多级目录,而android的data目录下是不允许有子目录;
当然,lua脚本也可以在运行时拷贝到外置sd卡中,不过既然放置在不安全的公共目录,就会有被第三方删除或篡改的危险,那么每次启动的时候必须做一次文件校验,同时,也必须对脚本进行加密,避免程序逻辑暴露;

lua自定义加载器

lua引擎提供了一个自定义加载器,当lua脚本中调用require时,会回调到自定义加载器的CFunction;利用这样特性,可以尝试取消掉脚本的运行时拷贝,而直接从应用的asset资源目录加载;自定义加载器的原理中,云风的blog中有介绍,以自定义方式加载lua模块
直接贴个代码实现

void addAssetLuaLoader(lua_State *L, lua_CFunction func)
{
   if (!func) return;

   lua_getglobal(L, "package");                   
   lua_getfield(L, -1, "loaders");   
   lua_pushcfunction(L, func);  
   int i=0;
   for ( i …

查看全文
Posted by zhengwen