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) |