Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348431
  • 博文数量: 42
  • 博客积分: 1896
  • 博客等级: 上尉
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 14:47
文章分类

全部博文(42)

文章存档

2012年(1)

2011年(21)

2010年(16)

2009年(4)

分类: Java

2011-04-15 12:46:50

ListView trick:
    由于内存性能的考虑,在用户滚动的时候,ListView回收使用views(ListView中显示的item)。如果快速滑动list,一个Item可能会被使用多次。如果这些Item包含一些动态加载(异步)的View(例如用于显示图片的ImageView),因为不能保证加载顺序,可能会导致最终显示的是前一item的状态(图片),这个时候需要采取一些措施避免出现这种情况。

Thread:
    1.UI toolkit不是Thread-safe,禁止在woker线程直接修改UI。
    2.费时操作使用woker线程,以免阻塞UI。
   

AsyncTask trick:
    1.必须在UI Thread(主线程)创建和调用execute(Params...),
    2.不要手动调用onXXX等回调函数,
    3.每个Task只能执行一次,多次执行会抛出异常。

AndroidHttpClient:
    不能在main thread使用(使用DefaultHttpClient或者URLConnection等)。

Handler:
    创建Handler的时候,Handler对象默认与创建它的线程和线程消息队列绑定在一起。在主线程创建Handler的一般先创建一个子Thread(HandlerThread )并start,然后再使用子Thead的looper来创建Handler,这样Handler的处理操作就是在子线程中完成,不会阻塞主线程。

Service:
    当Service不需要并发的处理多个请求的时候使用IntentService能够简化代码。
    如果Service端实现了多个IBinder,在获取不同的binder对象前,需要先调用unbindService解除前一个connection的绑定才可以bind新的IBinder,否则多次调用bindService返回的是同一个IBinder.Android底层结构-SDK Service线程知多少》是这样描述的。但是我在2.3.3的SDK运行ApiDemos的RemoteService例子时加上了Log查看结果并不是如此。因为RemoteService中对不同的IBinder在AndroidManifest.xml中添加特定的action在bindService的时候传入,然后在onBind中做出判断,这样就可以成功的多次bind不同的IBinder,而书中的例子使用了同一个action根据不同的Extra来判断不同的IBinder导致了这个问题。

IPC:
    1.使用AIDL接口,获取到IBinder对象来调用Service支持的接口。参照ApiDemos中的Remote Service Controller and Remove Service Binding。可以使用多个thread并发处理request,但是要保证thread-safe。
    2.使用Messenger进行通讯,参照ApiDemos中的Messenger Service。Messager只在单个子Thread中处理Message,保证thread-safe,但是无法实现并发处理Message。

Itent:
    在使用implict intent的时候如果在Intent中不设置category的话,系统默认会使用"android.intent.category.DEFAULT",所以如果要确保activity,service或者broadcast receiver能响应intent,在AndroidManifest.xml的filter里面必须设置category为"android.intent.category.DEFAULT",否者Activitynotfoundexception等着你。



阅读(782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~