android的国际化和本地化 03/11/2012 | jiangws internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n。 一般说明一个地区的语言时,用 语言_地区的形式,如 zh_CN, zh_TW. 各国语言缩写 http://www.loc.gov/standards/iso639-2/php/code_list.php,国家和地区简写http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html android 对i18n和L10n提供了非常好的支持。android没有专门的API来提供国际化,而是通过对不同resource的命名来达到国际化,同时这种命名方法还可用于对硬件的区分,如不同的新视屏用不同的图片。 在eclipse的工程中,res目录有默认几项resource,如 drawable, layout,menu,values 其余还有 res/anim/ 用来放置动画 res/xml/ 用来放置style theme等xml定义。 res/raw/ 用来放置data数据 我们引用这些resource时候,在java代码中是通过R.resource_type.resource_name的方式来使用,如setTitle(R.string.main_title); 还有一种是在xml中直接引用,如 <TextView android:id =”@+id/hello_view” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”@string/hello” /> 引用了名字为hello的字符串。当程序运行时,通过Resource类会装载strings.xml中名字为hello的字符串。但Resource类装载strings.xml时会根据当前手机的设置来选择装载哪一个xml文件。这些手机设置有 MCC and MNC, Language and region, Screen dimensions, Wider/taller screens, Screen orientation,Screen pixel density, Touchscreen type,… Read More
Code Style Guidelines for Contributors 03/11/2012 | jiangws The rules below are not guidelines or recommendations, but strict rules. Contributions to Android generally will not be accepted if they do not adhere to these rules. Not all existing code follows these rules, but all new code is expected to. In This Document Code Style Guidelines for Contributors Java Language Rules Don’t Ignore Exceptions Don’t Catch… Read More
探索并发编程(五)——Java多线程开发技巧 02/11/2012 | jiangws 很多开发者谈到Java多线程开发,仅仅停留在new Thread(…).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读《Java并发编程实践》了解到了很多不为我知但又非常重要的细节,今日整理如下。 不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(…).start(),对于一般场景是没问题的,但如果是在并发请求很高的情况下,就会有些隐患: 新建线程的开销。线程虽然比进程要轻量许多,但对于JVM来说,新建一个线程的代价还是挺大的,决不同于新建一个对象 资源消耗量。没有一个池来限制线程的数量,会导致线程的数量直接取决于应用的并发量,这样有潜在的线程数据巨大的可能,那么资源消耗量将是巨大的 稳定性。当线程数量超过系统资源所能承受的程度,稳定性就会成问题 制定执行策略 在每个需要多线程处理的地方,不管并发量有多大,需要考虑线程的执行策略 任务以什么顺序执行 可以有多少个任何并发执行 可以有多少个任务进入等待执行队列 系统过载的时候,应该放弃哪些任务?如何通知到应用程序? 一个任务的执行前后应该做什么处理 线程池的类型 不管是通过Executors创建线程池,还是通过Spring来管理,都得清楚知道有哪几种线程池: FixedThreadPool:定长线程池,提交任务时创建线程,直到池的最大容量,如果有线程非预期结束,会补充新线程 CachedThreadPool:可变线程池,它犹如一个弹簧,如果没有任务需求时,它回收空闲线程,如果需求增加,则按需增加线程,不对池的大小做限制 SingleThreadExecutor:单线程。处理不过来的任务会进入FIFO队列等待执行 SecheduledThreadPool:周期性线程池。支持执行周期性线程任务 其实,这些不同类型的线程池都是通过构建一个ThreadPoolExecutor来完成的,所不同的是corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory这么几个参数。具体可以参见JDK DOC。 线程池饱和策略 由以上线程池类型可知,除了CachedThreadPool其他线程池都有饱和的可能,当饱和以后就需要相应的策略处理请求线程的任务,ThreadPoolExecutor采取的方式通过队列来存储这些任务,当然会根据池类型不同选择不同的队列,比如FixedThreadPool和SingleThreadExecutor默认采用的是无限长度的LinkedBlockingQueue。但从系统可控性讲,最好的做法是使用定长的ArrayBlockingQueue或有限的LinkedBlockingQueue,并且当达到上限时通过ThreadPoolExecutor.setRejectedExecutionHandler方法设置一个拒绝任务的策略,JDK提供了AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy几种策略,具体差异可见JDK DOC 线程无依赖性 多线程任务设计上尽量使得各任务是独立无依赖的,所谓依赖性可两个方面: 线程之间的依赖性。如果线程有依赖可能会造成死锁或饥饿 调用者与线程的依赖性。调用者得监视线程的完成情况,影响可并发量 当然,在有些业务里确实需要一定的依赖性,比如调用者需要得到线程完成后结果,传统的Thread是不便完成的,因为run方法无返回值,只能通过一些共享的变量来传递结果,但在Executor框架里可以通过Future和Callable实现需要有返回值的任务,当然线程的异步性导致需要有相应机制来保证调用者能等待任务完成,关于Future和Callable的用法见下面的实例就一目了然了: public class FutureRenderer { private final ExecutorService executor = …; void renderPage(CharSequence source) { final List<ImageInfo> imageInfos = scanForImageInfo(source); Callable<List<ImageData>> task = new Callable<List<ImageData>>() { public List<ImageData> call() { List<ImageData> result = new ArrayList<ImageData>(); for (ImageInfo imageInfo : imageInfos) result.add(imageInfo.downloadImage()); return result; } }; Future<List<ImageData>> future = executor.submit(task); renderText(source); try { List<ImageData> imageData = future.get(); for (ImageData data : imageData) renderImage(data); } catch (InterruptedException e) { // Re-assert the thread’s interrupted status Thread.currentThread().interrupt(); … Read More
Android中利用App实现消息推送机制的代码实例 02/11/2012 | jiangws 1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。 我想到了一句话:don’t call me,i will call you! qq今天在右下角弹出了一个对话框:“奥巴马宣布本拉登挂了…”,正是如此。 自作聪明,就会带点小聪明,有人喜欢就有人讨厌。 2.独立进程 无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务。 我们需要一个独立进程的后台服务。 在androidmanifest.xml中注册service时,有一个android:process属性,如果这个属性以“.”开头,则为此服务开启一个 全局的独立进程,如果以“:”开头则为此服务开启一个为此应用私有的独立进程。举个具体的例子吧,我们新建了一个 application,创建了主进程com.cnblogs.tianxia,那么: view sourceprint?1 <!–下面会创建一个全局的com.cnblogs.tianxia.message的独立进程–> 2 <service android:name=”.service.messageservice” android:label=”消息推送” android:process=”.message” /> 3 <!–或者–> 4 <!–下面会创建一个应用私有的com.cnblogs.tianxia:message的独立进程–> 5 <service android:name=”.service.messageservice” android:label=”消息推送” android:process=”:message” /> 我们没必要建立一个全局的,本文选择第二种方案,创建一个当前应用私有的独立进程。 3.通知用户和点击查看 view sourceprint?01 public class messageservice extends service { 02 … Read More
Android中如何做到Service被关闭后又自动启动 02/11/2012 | jiangws 首先要说的是,用户可能把这种做法视为流氓软件。大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算。 我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。 先简单介绍,一会儿会贴上全部代码。 如何做到开机启动? 这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。 那如何做到启动一个Service,并且在用户关闭后能自动又启动了呢? 一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户可以关闭掉该Service。那么怎样才能使它被关闭掉以后,再次启动呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,就可以了。 还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、Service等等这些概念的同学可以百度一下。 package com.arui.framework.android.daemonservice; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.SystemClock; public class BootBroadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent mintent) { if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())) { // 启动完成 Intent intent = new Intent(context, Alarmreceiver.class); intent.setAction(“arui.alarm.action”); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); long firstime = SystemClock.elapsedRealtime(); AlarmManager am = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); // 10秒一个周期,不停的发送广播 am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 10 * 1000, sender); } } } package com.arui.framework.android.daemonservice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; … Read More
Android中Context详解 —- 你所不知道的Context 02/11/2012 | jiangws 前言:本文是我读《Android内核剖析》第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书。 大家好, 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友—–Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service、BroadcastReceiver、Activity等都会利用到Context的相关方法 ; 说它陌生,完全是 因为我们真正的不懂Context的原理、类结构关系。一个简单的问题是,一个应用程序App中存在多少个Context实例对象呢? 一个、两个? 在此先卖个关子吧。读了本文,相信您会豁然开朗的 。 Context,中文直译为“上下文”,SDK中对其说明如下: Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as… Read More
深入理解ANDROID消息处理系统——LOOPER、HANDLER、THREAD 02/11/2012 | jiangws | 1 Comment (自) Activity,Service属于主线程,在主线程中才能更新UI,如toast等。其他线程中不能直接使用,这时可以使用Handler来处理,Handler可以在Activity和Service中。 关于在非UI线程中进行UI操作会出现问题: Can’t create handler inside thread that has not called Looper.prepare() 这时有两种方式来解决: (一)在该非UI线程中创建消息队列(因为创建的工作线程默认是没有消息循环和消息队列的),Looper.prepare();…..;Looper.loop(); newThread() { public void run() { Looper.prepare(); //创建消息队列 todo(); Looper.loop();//进入消息循环 }}.start(); (二)运用Handler机制: package com.simon; import android.app.Activity; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.os.Handler; public class MyHandler extends Activity { static final String TAG = “Handler”; Handler h = new… Read More
Java Tip 10: Implement callback routines in Java 01/11/2012 | jiangws This story appeared on JavaWorld at http://www.javaworld.com/javatips/jw-javatip10.html Java Tip 10: Implement callback routines in Java Using interfaces to implement the equivalent<BR> of callback functions in Java By John D. Mitchell, JavaWorld.com, 06/01/96 Developers conversant in the event-driven programming model of MS-Windows and the X Window System are accustomed to passing function pointers that are invoked (that is, “called… Read More
中国的两个转捩点:如何塑造全球新未来 ——新加坡副总理尚达曼于东亚研究所创所15周年论坛的主题演讲 01/11/2012 | jiangws2002 新加坡)联合早报 (2012-11-01) 首先,感谢东亚研究所邀请我出席这个各界知名人士和专家学者聚集一堂的论坛。 东亚研究所对中国经济、社会和政治发展的独立与严谨研究,让它成为一个重要和卓有声誉的研究中心。王赓武教授所提到,自吴庆瑞博士担任研究所前身所长时便贯彻研究工作的精神,也让我印象深刻——尝试了解中国与其面对挑战的复杂性的谦逊精神。我们应该以同样的精神来观察中国未来的走向。 中国的发展对世界有重大影响。王教授刚才谈到了美国和中国即将出现的领导人更换。我相信在11月8日发生的事,会比在11月6日发生的事来得重要。 世界现在比以往更依赖中国及其成功的经济转型;也更依赖中国的需求、中国作为投资来源、以及依赖中国来加强世界不同经济区域的互补性。最后,世界也更依赖中国来保持一个稳定的国际秩序。 中国正经历两个主要转捩点,或者更准确的说,是“拐点”(inflextion points)。首先,是其经济的结构和驱动力;其次,是它对世界的影响力及领导世界的角色。在国内经济转型与在世界舞台所扮演角色的转变,中国皆面对重大转折点。 从剩余劳动力到劳动力萎缩 首先,在国内经济转型上,中国经济正从“旧常态”过渡到“新常态”。“旧常态”着重于资本累积,国有企业扮演主导角色,是个家庭变相津贴生产者的体系。现在,它正逐步转移到一个更具竞争力、更依赖消费为成长驱动力、及更注重资本效益的“新常态”。简而言之,是从注重资本累积转变为注重资本效益的模式。然而,这些改变要通过整体的复杂体制改革才能实现。 利用成长会计(growth accounting)来分析中国增长的经济学家,对中国过去30年的崛起已有很好的了解。使用的估计方式虽然不同,但一些基本的结论却很清楚。 首先,大规模从低生产力农业转移到产业和其他城市化活动的劳动力,给经济增长带来巨大贡献。这是30年来增长的主要来源,就像日本、韩国和台湾早几十年前,和欧洲在二战前与二战后的情况一样。 其次,在工业化过程起步慢让中国得到不少优势,可以很快地跟上全球最佳实践经验。从世界各地注入的科技和点子,是促进增长的动力,让中国的“全要素生产力”(Total Factor Productivity)取得非比寻常的快速增长。 第三,中国是享有优势,但也只是在有限期间——经济自由化的头20年——以人口来看。在过去10年放缓前,它每年取得3%的快速劳动力增长。整体的劳动力增长,加速了劳动力从很低生产力活动转移到中等生产力及生产力更高的活动。 劳动力过剩的阶段就快过去了。中国沿岸省份在经济发展上肯定已到了经济学家所说的路易斯转捩点(Lewisian turning point):它们再也享受不到廉价外来民工,而工资也急剧上升。中部和东北部省份还没有到达这个阶段。但大概不出10年,整个中国将发现依赖廉价劳工再也不是其工业竞争力和增长的基础。 此外,从一两年后开始,按绝对价值计算,中国的整体劳动力将在接下来数十年逐渐萎缩。同日本、韩国与台湾的发展经验比较,中国比它们更早来到这个阶段。 中国目前的人均收入,大概是日本1980年及韩国和台湾约1990年的水平。这些经济体在达到中国今天的人均收入水平后,劳动力还持续增长了10到20年。日本的人口正在萎缩,但台湾和韩国的劳动力仍有小增长,就像新加坡和香港。中国即将经历的劳动力萎缩将是独特的,因为它仍是个发展中国家。这也同诸如印度等发展中国家不一样,印度的劳动力在未来10年甚至是更长的时间里,将持续显著增长。 这对中国来说不一定是不利的。但却意味着必须更重视资本的有效利用,和提高每个经济领域的生产力。为年长者建立一个健全的社会安全网也变成一项紧迫的工作。 中国有提高生产力的巨大空间,这是我们对中国增长前景应该保持乐观的基本原因。中国的生产力只是美国的约15%-18%,或亚洲新兴工业化经济体的平均约25%,有不少空间来追上——透过新科技、新点子和国内经济更有效的资源分配。同日本及新兴工业化经济体比较,中国劳工的人均资本存量(capital stock per worker)也还处于低水平,有大量的空间提高生产力和收入。 人力资源发展:从数量到质量 这需要经济和社会领域策略的改变,并为重要的国内改革增添动力。首先,在人力资源上,中国正从讲究数量过渡到重视素质。在提供普遍的基本和中学后教育,中国是个成功的例子,尤其是同印度和其他大多数巨大的发展中区域相比。 但其教育体系质量参差不齐。就像世界银行所指出,寻求教育质量的平等,比寻求教育机会的平等,是中国教育制度未来更大的挑战。 确保毕业生受雇也是个棘手问题。中国培养了许多毕业生。中长期来说,毕业生可能供过于求。从数据来看,没有受雇的年轻毕业生超过9%,尤其是美术和数学系的毕业生。对理论过于注重,对同市场相关的技能不够重视是个问题。 更开放的经济 第二项挑战是通过贸易和投资,维持并加快中国经济的开放度。这在全球重新平衡的讨论中并没有受到足够的关注。我们在谈论美国减少经常项目赤字及中国减少盈余时,解决方案不应该是中国把焦点放在内需,也就是从出口导向转为促进内需。更关键的增长解决方案是加速全球化,进一步开放贸易。按中国的情况并考虑到其发展阶段,若我们要减少盈余,增加进口是比减少出口更好的方法。 这是重要的,因为我们的考虑必须超越整体的不平衡。中国及东亚发展的动力,来自投入世界最先进市场所引入的点子和科技。符合最先进市场买家指定需求的外国直接投资及出口,是经济发展的主要动力。 以像中国这样平均生产力仍然偏低的国家来说,优先考量应该依旧是通过双向的外贸和投资,尽量输入点子、最佳实践经验及科技。开放对长期增长很重要。出口和入口总流量的增长——也同样或甚至比贸易逆差更重要。 过渡到以市场为根本的融资 要更有效的使用资本,中国的第三个挑战,是在经济市场化取得进展。不论是以任何对比分析来看,中国都是从计划经济过渡到市场经济的明显成功例子。和其他新兴区域不同,中国自70年代末开始,便几乎每五年就提出并坚持新的改革。在实行上虽然取得不同程度的成功,但它每五年便有重大的经济改革——印度、俄罗斯及其他大新兴经济体如巴西都没有这样做。 尽管增长有许多不符合效益的地方,中国的国有企业在市场经济的转型上,表现远比俄罗斯寡头出色。严重的不平衡存在,但这是没有导致重大混乱的增长故事,本身已是一项成就。 中国经济要进一步市场化,作为更有效率和平衡经济的基础,并改善家庭的福利,还得在未来进行重大改革。 在未来五年甚至是更长的时间里,中国把重点放在这些改革。改革由国有企业开始。中国必须摆脱受到“指示”的投资,反映投资的真正成本,来激励国有企业以真实的盈利率为决策的基础。与这相关的还有许多改变——股利政策改革、法律和会计上的改变及规制改革。 市场化的另一个重要领域是金融界。中国希望建立更具竞争力、更健全及更多元化的金融领域,来补助发展更平衡及由生产力驱动的经济增长的努力。金融领域改革有五个紧密相连的因素——它们之间的关系显示了金融领域改革的复杂性。 首先是把信贷制度从非正式的方式往正式的方式转移,前者是对金融稳定的威胁。这包括让正式信贷制度扮演更重要的角色,让国有企业以外的私企和家庭也可以受惠,尤其是更方便中小企业向银行借贷。银行从受指示的借贷转移到以盈利驱动的借贷过程中,必须建立有力的风险管理机制。 第二是发展资本市场,包括股票和债券市场,让金融系统更多元化,不过度依赖银行信贷。像中国这么大的转型经济体,有效管理资本市场是项重大挑战。市场必须逐渐由经济基本面驱动,而不只是投机情绪。如果成功了,资本市场可以反映筹集资金的真正成本,为大型企业提供有益的纪律。 第三是把利率市场化。中国人民银行采取了重要的措施,有秩序地过渡到由市场力量决定的利率。这可以让家庭和个人的储蓄赚取更高利息,也让借贷者更清楚实际的借贷成本。 第四是汇率。我相信,在接下来的5年-10年里,中国及大部分东亚地区逐步提高名义和实际汇率是有利的。为什么呢?因为这同把国内生产结构往高增值方向提升是一致的,尤其是在激励国内消费的中国。这同让汇率自由浮动以对短期资本流作出反应的呼吁是不同的。这样做是不明智的,也没有适当的经济理由。中长期逐步提高实际汇率可以帮助支持国内经济转型,对中国是有利的。与其让国内的通胀增速比世界其他地方快,倒不如提高实际汇率。 第五是持续逐步开放资本账户,鼓励双向投资。这也应该是渐进的以免造成金融体系的不稳定,但它是接下来5年-10年的重点考虑。 这五个改革元素缺一不可,也必须以同样的速度进行,尤其是不可能让对外开放的步伐远远超过国内改革的速度而不影响金融稳定。以过去五年来看,我得说中国把这极端复杂和平衡的工作处理得很好。然而,这过程中会有赢家和输家,既得利益也会抗拒未来的改变。这显示为什么经济改革是项艰巨的政治工作,既需要技巧,也需要政治决心。 从“供应震撼”到“需求震撼” 现在,让我谈谈中国对世界的影响力及领导世界的角色。 我们知道中国未来会是个重要需求来源。发达世界将经历长时间的去杠杆化,增长也因此可能低于潜能。另外一个考虑中国角色的方式是,中国在过去30年给世界经济带来了经济学家所称的巨大“供应震撼”,未来却不只是“供应震撼”,还会是个“需求震撼”。 “供应震撼”是因为数目庞大的廉价但相对有效率的工人进入了全球市场体制。当工资日益增高及中国中产阶级消费快速增长时,便会为全球的生产者提供一个主要的新最终需求来源。在中国继续开放其经济的同时,这个“需求震撼”的规模会很大。 但“供应震撼”却还没有过去,而是改变了方式。中国正向价值链上游攀升,以往在价值曲线非常低端的“需求震撼”,正转向中等水平工作,甚至一些如研发领域的高水平工作。因此,一系列的中产阶级工作,包括生产和其他白领行业,现在将面对竞争。发达经济体及亚洲新兴工业化经济体的中等水平工作,将面对来自中国的竞争。这是中国对全球劳动力市场冲击的重大改变,虽然它也为世界提供了需求。 中国经济演化的同时,会给其他发展中经济体的其他低成本、劳工密集生产者带来许多机会。正如经济学家林毅夫在最近的一篇文章指出,中国一小部分劳工密集制造业向海外转移,就会给这些发展中国家带来巨大好处。比如,如果1%的中国成衣业转移到非洲,非洲国家的成衣出口将猛增50%。中国工资的上扬,将导致亚洲和其他发展中区域新的劳动分工。 全球领导能发挥作用吗? 然而,中国同全球关系的“拐点”不限于经济,也关系到它在维持稳定国际秩序的角色与责任。我们正进入全球领导的独特阶段。这不是突然的改变,而是趋向一个新局势的渐进发展。它很可能是个多极化的世界,并出现一个仍然是发展中国家的全球领袖。中国经济发展意味着它必须在共同领导世界上扮演重要角色。中国已成为世界第二大经济体,并将在数年后成为世界最大经济体。然而,就人均收入而言,它并不是个富裕的国家。以发达国家水平来看,其大部分人口很可能继续处于贫穷状况。这是前所未有的情况。… Read More
虾仁蒸蛋的注意点 01/11/2012 | jiangws2002 小贴士 蛋液搅打要轻一点,最好不要出很多泡沫。–很关键 水量为鸡蛋的一倍半左右,最好用温水。–有道理 蛋液过滤一下再蒸制,可使蒸好的蛋羹口感更细滑。 蒸制的时间以自己的蛋液用量为准,鸡蛋量少时间也要相应调整。–一般15分钟(3,5个)… Read More