Posted by & filed under Android.

It is always good practice to use the getExtennalFilesDir() method to find the location of the SD Card on an Android device.(Don’t fix using \sdcard). Because Android can run on a large number of devices with different specications, the location …

Posted by & filed under Android.

Android SDK 本身包含很多帮助开发人员设计、开发、测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具。

#1: Eclipse ADT

Eclipse ADT 是 Eclipse 平台下用来开发 Android 应用程序的插件。

Eclipse + ADT

#2: The SDK and AVD Manager

该工具包含很多重要的功能,包括管理不同的 Android SDK 版本(构建目标),你知道的 Android 的版本众多,API上有些兼容性问题。另外该工具还用于管理 Android 虚拟设备配置 (AVD) ,用来配置模拟器。

#3: Android Debug Bridge

adb(Android Debug Bridge)是Android提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态。…

Posted by & filed under Android.

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数据

android res 结构

 

 我们引用这些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”

Posted by & filed under Java.

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 …

Posted by & filed under Java.

很多开发者谈到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的用法见下面的实例就一目了然了:

 

  1. public class FutureRenderer {  
  2.     private final

Posted by & filed under Android.

 

1.消息推送机制
    
服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。
    
我想到了一句话:don’t call me,i will call you!
     qq
今天在右下角弹出了一个对话框:奥巴马宣布本拉登挂了…”,正是如此。
    
自作聪明,就会带点小聪明,有人喜欢就有人讨厌。

2.独立进程
    
无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务。
    
我们需要一个独立进程的后台服务。
    
androidmanifest.xml中注册service时,有一个android:process属性,如果这个属性以“.”开头,则为此服务开启一个

全局的独立进程,如果以“:”