zoukankan      html  css  js  c++  java
  • android 观察者模式

    1:观察者模式:
     
    1:使用场景:一般使用在自定义控件的事件点击监听上面(或者封装方法进行回调)
    2:写观察者模式步骤:
    (1):声明一个接口
    (2):接口里面封装一个抽象方法
    (3):需要封装一个方法,方法的参数就是接口类的实例化(用来设置监听)
    (4):声明接口类的实例化对象
    (5):接口实例化对象调用抽象方法
     
    接口回调实现方式:
    (1):观察者模式
    (2):抽象类
     
     
     
    1:抽象类与接口的区别:
    (1):默认的方法实现
    抽象类可以有默认的方法,接口完全是抽象的。它根本不存在方法的实现
    (2): 实现
    抽象类:子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现
    接口:子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
    (3):构造器
    抽象类:抽象类可以有构造函数
    接口:接口不能有构造函数
    (4):与正常Java类的区别
    抽象类:除了你不能实例化抽象类之外,它和普通Java类没有任何区别
    接口:接口是完全不同的类型
    (5):访问修饰符
    抽象类:抽象方法可以有public、protected和default这些修饰符
    接口:接口方法默认修饰符是public。你不可以使用其它修饰符
    (6):main方法
    抽象类:抽象方法可以有main方法并且我们可以运行它
    接口:接口没有main方法,因此我们不能运行它。
    (7):多继承
    抽象类:抽象方法可以继承一个类和实现多个接口(单继承)
    接口:接口只可以实现一个或多个其它接口(多实现)
    (8): 速度
    抽象类:它比接口速度要快
    接口:接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
    (9):添加新方法
    抽象类:如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。
    接口:如果你往接口中添加方法,那么你必须改变实现该接口的类
     
    2: public,private,protected,default四种修饰符的作用范围:
    (1): public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
    (2):private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用(在相同的包下,不同的类中是不可以访问其他类中的private修饰的方法的)
    (3):protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。(同一个包下的都可以调用,不同包下面的调用不了)
    (4):default 则在包内包外的子类都可见
     
    private 本类中 其子类和其他都不能调用
    protected 本类,相同包下面的类,子类能调用 其他不能
     
    public 本package都能调用
     
    default 本类,相同包中能调用 其他不能调用
     
    3:自定义控件
    1:继承view
    2:重写OnDraw,onMesure,onLayout
    3进行绘制
    (1):声明画笔
    (2):设置画笔属性(包括颜色和宽度和是不是空心圆和设置抗锯齿)
    (3):绘制圆
    4:设置监听
    (1):重写onTouchEvent方法
    (2):获取点击坐标(x,y)
    (3):进行计算
    (4):如果在范围内就点击控件
     
    4:内存泄露会造成oom吗?
    内存泄露多了就会造成oom.
    内存泄露的危害:
    只有一个,那就是虚拟机占用内存过高,导致OOM(内存溢出)
     
    使用Handler导致内存泄露的解决方法
    方法一:通过程序逻辑来进行保护。
    1.在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。
    2.如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。
    方法二:将Handler声明为静态类。
    静态类不持有外部类的对象,所以你的Activity可以随意被回收。代码如下:
    static class MyHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
    mImageView.setImageBitmap(mBitmap);
    }
    }
    但其实没这么简单。使用了以上代码之后,你会发现,由于Handler不再持有外部类对象的引用,导致程序不允许你在Handler中操作Activity中的对象了。所以你需要在Handler中增加一个对Activity的弱引用(WeakReference):
    static class MyHandler extends Handler {
    WeakReference<Activity > mActivityReference;
    MyHandler(Activity activity) {
    mActivityReference= new WeakReference<Activity>(activity);
    }
    @Override
    public void handleMessage(Message msg) {
    final Activity activity = mActivityReference.get();
    if (activity != null) {
    mImageView.setImageBitmap(mBitmap);
    }
    }
    }
    将代码改为以上形式之后,就算完成了
     
  • 相关阅读:
    关于Mac网络偏好设置的一些坑
    NOI2018网络同步赛爆零记
    【搞事情】英文文档单词对比&自动翻译
    函数
    文件处理的详细介绍
    字符编码+文件处理
    元组类型+字典类型+集合类型的详细讲解
    可变不可变类型+数字类型、字符串类型、列表类型的内置方法
    流程控制之if判断,while循环,for循环
    变量剩余补充+基本数据类型+输入输出+基本运算符
  • 原文地址:https://www.cnblogs.com/lizhanqi/p/6020646.html
Copyright © 2011-2022 走看看