大晚上的有些睡不着,准备记录点android比较重要的知识点,也是平常会遇到的问题点。我们做android开发除了掌握基础知识之外,比较深入点的知识也需要个人在实际中去实践才能真正理解其作用,单靠记忆只是几天或者一两周的效果,很容易忘记。因此在工作之余记录所遇到的问题或者比较好的技术可以记录记录,这也许在以后就是你一份宝贵的财富。好了,废话少说,下面我简单记录下我个人觉得比较重要的知识点。
1.android子线程使用Handler:
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Looper.prepare();
......
Looper.loop();
}
};
2.服务service被绑定后,如何才能在绑定的一端被阻塞后服务端不被阻塞:
在aidl文件方法前面添加关键字oneway
3.线程死锁:
java中导致死锁的原因 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。
死锁产生的四个必要条件:
1 )、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2 )、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3 )、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
4 )、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
解决办法:
避免在一个同步方法中调用其它对象的延时方法和同步方法,也要慎用锁。
4.Handler 弱引用,防止内存泄漏
private static class MyHandler extends Handler {
WeakReference<MainActivity> weakReference ;
public MyHandler(MainActivity activity ){
weakReference = new WeakReference<MainActivity>( activity) ;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if ( weakReference.get() != null ){
// update android ui
}
}
}
Activity对象被设置为弱引用,当Activity被销毁时就直接被回收了,不存在handler还拥有其引用导致无法释放问题,同理在线程中或者其他对象持有activity引用时候也是可以这样处理的,可以被立即释放不会导致内存泄漏。
5.Service服务是运行在主线程中,生命周期中不能做耗时操作,如果需要做耗时操作,可以使用如下两种方式:
1):另起线程做耗时操作
2):使用IntentService(Android封装好,可以在方法onHandleIntent(Intent)做耗时处理,并且他在工作执行完毕后自动销毁)
6:Binder通讯原理和使用方法:
基于C/S架构的,包含4个角色:Client、Server、Binder驱动ServiceManager,通信过程:
1 )Server向ServiceManager注册。Server通过Binder驱动向ServiceManager注册,声明可以对外提供服务。ServiceManager中会保留一份映射表。
2 )Client向ServiceManager请求Server的Binder引用。Client想要请求Server的数据时,需要先通过Binder驱动向ServiceManager请求Server的Binder引用(代理对象)。
伞向具体的Server发送请求。Client拿到这个Binder代理对象后,就可以通过Binder驱动和Server进行通信了。
3 )Server返回结果。Server响应请求后,需要再次通过Binder驱动将结果返回给Client。
使用方法:
public static void addService(String name, IBinder service)//通过addService将服务保存在全局变量service_list中
IBinder binder = ServiceManager.getService(xxx)//通过对应字段取出
暂时记录这些问题点,以后有添加必要的话会在此基础上进行修改,广大的读者有好的建议,欢迎发表评论,本人将很高兴接受。