android进阶知识点记录

      大晚上的有些睡不着,准备记录点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)//通过对应字段取出

     暂时记录这些问题点,以后有添加必要的话会在此基础上进行修改,广大的读者有好的建议,欢迎发表评论,本人将很高兴接受。

Guess you like

Origin blog.csdn.net/daxiangzaici/article/details/106416237