精华内容
下载资源
问答
  • 当我们的某个数据库或者数组列表等发生添加,删除等改变时,我们希望能在代码中立马知道,那么这时候可以使用内容观察者。 先在想观察的方法里注册观察者 public void add(String packageName) { ...

    当我们的某个数据库或者数组列表等发生添加,删除等改变时,我们希望能在代码中立马知道,那么这时候可以使用内容观察者。

    先在想观察的方法里注册观察者

    public void add(String packageName) {
        SQLiteDatabase db = openHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("packagename", packageName);
        db.insert("info", null, values);
        db.close();
        //自定义注册一个内容观察者,uri的字符串随便写什么,但是要有content://头。
        context.getContentResolver().notifyChange(Uri.parse("content://com.example.wanghao.didisafe/applock.db"),null);
    }
    
    public void delete(String packageName) {
        SQLiteDatabase db = openHelper.getWritableDatabase();
        db.delete("info", "packagename = ?", new String[]{packageName});
        db.close();
        //自定义注册一个内容观察者
        context.getContentResolver().notifyChange(Uri.parse("content://com.example.wanghao.didisafe/applock.db"), null);
    }
    然后在正在运行的代码中拿到这个观察者的内容解析者
    //在初始化代码里注册一个内容解析者
    Uri uri = Uri.parse("content://com.example.wanghao.didisafe/applock.db");//Uri是一样的	
    observer = new MyObserver(new Handler());
    getContentResolver().registerContentObserver(uri, true, observer);
    在MyObserver里处理变化的数据
    private class MyObserver extends ContentObserver{
    
       public MyObserver(Handler handler) {
          super(handler);
       }
    
       @Override
       public void onChange(boolean selfChange) {
          super.onChange(selfChange);
          Log.i(TAG,"啊啊啊啊,我发现了数据库的内容变化了。");
          protectedPacknames = dao.findAll();
       }
    在destroy里反注册
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        getContentResolver().unregisterContentObserver(observer);
        observer = null;
    }

    展开全文
  • 自定义观察者模式

    2015-07-11 18:41:37
    观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子自定义了一个观察者模式
  • 自定义类之间的继承

    2019-07-21 21:31:00
    第一种方法 function A(){ } A.prototype.c = 10; function B(){ } B.prototype = new A() console.log(new B().c) //10 ...1.为啥是 B.prototype = new A(); 而不是 B.prototype = A 或者 B....要实现继承...

    第一种方法

    function A(){
    
      }
    A.prototype.c = 10;
    function B(){
    
      }
    B.prototype = new A()
    console.log(new B().c)  //10
    

    1.为啥是 B.prototype = new A(); 而不是 B.prototype = A 或者 B.prototype = A.prototype
    要实现继承,就必须保证B继承A以后,B所做的修改不能影响到A以及继承自A的其它对象。
    如果B.prototype = A的话,那么着两个对象的引用是完全一致了,这样的话,如果赋值 B.prototype.name=45455;那么A.name就直接变成45455;
    直接把A和继承自A的其它对象全部改了,这根本谈不上继承。
    至于B.prototype = A.prototype也是同理,修改B的原型就会直接把A的原型给污染掉。
    B.prototype = new A();
    这个方法,是创建了一个新的对象{},并且继承了A的原型,这是一个新对象,不是和A同一引用,所以不会污染A。

    第二种方法

    function A(){
      this.name = "admin"
    }    
    function B(){
      A.call(this) 
    }
    console.log(new B().name)
    

    A.call(this)
    把A的指向改为this,在函数B中就是B,然后A的函数内this具有nane属性,此时的this已经是B,所以被name属性被B复制过来

    展开全文
  • 自定义滚轮WheelView系列---设计模式之观察者模式 一个稍微复杂的自定义控件其实涉及到很多方面,比如View的事件体系,View的工作原理,还有缓存技术,设计模式等等 自定义滚轮很多方面都是参考了ListView的实现原理...

    对于Adapter我相信大家都很熟悉,在使用ListView或者是GridView控件时,我们经常会用到Adapter,我们通常的做法是自定义一个Adapter继承自BaseAdapter,然后调用ListView的setAdapter()方法,将数据与ListView绑定起来。但是我们对于Adapter又了解多少呢,我们是否知道它的实现原理呢。

    今天我们要说的是Adapter中的观察者模式,如果你想详细了解观察者模式,你可以参考这篇文章 设计模式学习笔记-观察者模式

    一、关于观察者模式主要有以下几点:

    1、定义:观察者模式(Observer Pattern)也叫发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式,其定义如下:

    Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖与他的对象都会得到通知并被自动更新)

    2、观察者模式的通用类图:

    3、观察者模式的几个角色名称:

    ·Subject被观察者:定义被观察者必须实现的职责,他必须能够动态的增加,取消观察者。他一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知被观察者。

    ·Observer被观察者:观察者接受到消息之后,即进行update(更新方法)操作,对接收到的信息进行处理。

    ·ConcreteSubject具体的被观察者:定义被观察者自己业务逻辑,同时定义对哪些事件进行通知。

    ·ConcreteObserver具体的观察者:每个观察者的在接收到消息后的处理反应是不同的,各个反应者有自己的处理逻辑。

     4、观察者模式的使用场景:

    1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变

    2、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节

    、观察者模式在ListView和WheelView中的应用

    1、我们先来看一下类图:

    2、关于上面类图,我们可以发现:

    [1]DataSetObserve是观察者

    [2]DataSetObservable是被观察者,即角色,它持有很多个观察者对象

    [3]DataSetObservable持有DataSetObserve对象

    [4]而BaseAdapter中又持有DataSetObservable对象,所以相当于,BaseAdapter也持有DataSetObserve对象
    3、接着我们再看ListView中的setAdapter()方法

    ListView的setAdapter()方法的源代码我就不贴出来了,我们可以在setAdapter()方法中可以看到这样一句mAdapter.registerDataSetObserver(mDataSetObserver);在BaseAdapter类中我们可以看到registerDataSetObserver()方法的具体实现为:

    public voidregisterDataSetObserver(DataSetObserver observer) {
    mDataSetObservable.registerObserver(observer);
    }
    而该方法又是调用了DataSetObservable中的registerObserve(observer)方法,在DataSetObservable中我们可以看到registerObserve()方法的具体实现为:
    public voidregisterObserver(T observer) {
    if(observer ==null) {
    throw newIllegalArgumentException("The observer is null.");
    }
    synchronized(mObservers) {
    if(mObservers.contains(observer)) {
    throw newIllegalStateException("Observer "+ observer +" is already registered.");
    }
    mObservers.add(observer);
    }
    }
    所以通过Listview的setAdapter方法,我们就将一个DataSetObserve添加到了Adapter的DataSetObservable中,即给adapter添加了一个观察者
    4、下面我们来看一下adapter中notifyDataSetChanged方法的实现过程
    当数据有变动时,我们经常通过notifyDataSetChanged方法来刷新界面,在BaseAdapter类中,我们可以看到notifyDataSetChanged方法的具体实现为:
    public voidnotifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
    }
    我们又可以看到notifyDataSetChanged()方法中仅仅是调用了DataSetObservable中的notifyChanged()方法,接下来我们再来看notifyChanged方法的具体实现:
    DataSetObservable类中
    public voidnotifyChanged() {
    synchronized(mObservers) {
    // since onChanged() is implemented by the app, it could do anything, including
    // removing itself from {@link mObservers} - and that could cause problems if
    // an iterator is used on the ArrayList {@link mObservers}.
    // to avoid such problems, just march thru the list in the reverse order.
    for(inti =mObservers.size() - 1; i >= 0; i--) {
    mObservers.get(i).onChanged();
    }
    }
    }
    我们可以看到,它的实现也很简单,就是通过循环的方式,依次调用每个观察者(DataSetObserver)的onChanged()方法;我们在ListView的setAdapter方法中调用的mAdapter.registerDataSetObserver(mDataSetObserver);方法中的参数mDataSetobserver是一个AdapterDataSetObserver 类型的类,而它又是继承自DataSetObserver类的, 下面我们可以看到AdapterDataSetObserver 类的源码实现:
    class AdapterDataSetObserver extends DataSetObserver
    {
    private Parcelable mInstanceState = null;
    AdapterDataSetObserver() {
    }
    public void onChanged() { mDataChanged = true;
    mOldItemCount = mItemCount;
    mItemCount = getAdapter().getCount();
    if ((getAdapter().hasStableIds()) && (mInstanceState != null) && (mOldItemCount == 0) && (mItemCount > 0))
    {
    onRestoreInstanceState(mInstanceState);
    mInstanceState = null;
    } else {
    rememberSyncState();
    }
    checkFocus();
    requestLayout();
    }
    //...省略不必要代码
    }
    在该类中我们可以看到调用了requestLayout()方法,该方法就是用来进行页面刷新的
    自定义滚轮中AbstractWheelAdapter的实现方式与Android中BaseAdapter的实现方式类似,它也使用了观察者模式,只是他没有使用一个单独的被观察者角色(类似于Android源码中的DataSetObservable类),而是让AbstractWheelAdapter直接持有观察者对象,即AbstractWheelAdapter本身就是一个被观察者,它里面有一个datasetObservers变量用来存储观察者对象。
    Android源码的实现方式为,adapter持有被观察者,而被观察者再持有观察者对象。
    展开全文
  • java事件处理机制(自定义事件) java中的事件机制的参与有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event source:具体的事件源...
  • 观察者模式:又叫发布订阅模式,多个观察者可以实时监听一个主题对象,而javascript中最常用的实现方式是事件触发机制。 es6实现: 要知道需要有什么东西,和构造函数是es6中基本的对象结构 class BaseEvent { ...
  • GOF对观察者模式的定义:Observer的意图是定义对象之间的一种一(被观察者)对多(观察者)的关系,当一个对象的状态发生改变时,所有依赖它的对象得到通知,并且会自动更新自己。 从这段经典的定义中,可以推测...
  • 有匹配模式么O(∩_∩)O~,要让内容观察者知道我们的数据发生变化了,要调用notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer)这个方法,第一个参数就是我们匹配的uri,第二个参数是要提醒哪个内容...
  •  ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于  数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。...
  • Springboot使用@EnableAsync,@EventListener自定义异步,同步监听器(观察者模式) 1. Springboot 启动中开启异步 加个@EnableAsync就行了 @SpringBootApplication @Controller @EnableAsync public class ...
  • 内容观察者(针对contentprovider)

    千次阅读 2015-04-19 14:51:32
    通过内容观察者实时观察第三方数据的变化。 步骤如下; 1、获得内容解析者 2、对内容解析者注册内容观察者,第二个参数为true则模糊匹配,前缀相同即可,false就完全匹配。 3、继承contentObserver并...
  • 观察者模式

    千次阅读 2015-12-26 19:58:51
    概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。问题的提出在...
  • 4.SQLite数据库,内容提供者、内容观察者
  • 理清一下思路,整体框架应用观察者模式,可以细分为以下几个步骤: 1 、实现一个抽象 UrlAsyNet 继承 AsyncTask,Integer,T>( 这里第三个参数设置为 T 是为了适配不同的传输类型 ) 。 这里为什么不用接口呢?...
  • Java观察者模式(Observer)

    千次阅读 多人点赞 2019-02-16 23:57:11
      观察者模式java GOF23种设计模式中的一种。在最近介绍的Redis和ActiveMQ中都涉及到了观察者模式,所以我们在本文详细介绍下此模式: 观察者模式   观察者模式又称为发布/订阅(Publish/Subscribe)模式,在对象...
  •  本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式。  说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙。当初LZ要做一个小型...
  • 1. 观察者模式观察者模式是一种设计模式,其中一个对象(称为主体)根据对象(观察者)维护一个对象列表,自动通知他们对状态的任何更改。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,...
  • B程序使用ContentResolver根据url去查询A程序提供的数据(内容解释者),还可以使用ContentObserver去观察A'程序中数据的变化(内容观察者) A程序(代码中取名为 TestContentProvider) 主要是ContentProvider...
  • Java 实现观察者(Observer)模式

    千次阅读 2014-10-10 19:11:15
    * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservable extends Observable { private int data; public UpdateObservable(Observer observer)
  • 设计模式走一遍---观察者模式(下)

    千次阅读 2018-09-06 11:39:52
    上篇我们讲解了观察者模式的一些知识,而且自定义观察者模式的经典代码,(传送们:设计模式走一遍—观察者模式(上)) 这篇简单讲一下JDK自带的观察者模式实现代码。 对于观察者模式,JDK中提供了一个Observer接口...
  • Android观察者模式

    千次阅读 2019-01-22 12:25:06
    定义 定义对象间一对多的关系,当一...Android内置了Observer和Observable,来看看观察者和被观察者的定义: 观察者 public interface Observer { void update(Observable var1, Object var2); } 被观察者 pub...
  • 继承已有控件 比如自定义SmartImageView继承ImageView 完全自定义控件 上一篇写了自定义控件的自定义属性深入理解点击链接查看,是自定控件比较难以理解的地方,但是是很重要滴,是基础。...
  • 设计模式 | 观察者模式及典型应用

    千次阅读 2018-10-24 01:05:45
    JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托事件模型DEM中的观察者模式 Spring ApplicationContext 事件机制中的观察者模式 观察者模式 观察者模式是设计模式中的 “超级模式”...
  • 通过开源框架,来理解下拉刷新和加载更多的解决方案。 通过RecyclerView的Adapter来理解观察者模式。
  • iOS 自定义播放器

    千次阅读 2016-02-25 17:07:34
    自定义播放器的一些常识: MPMoviePlayerController足够强大,几乎不用写几行代码就能完成一个播放器,但是正是由于它的高度封装使得要自定义这个播放器变得很复杂,甚至是不可能完成。例如有些时候需要自定义...
  • 最近做项目,闲来无聊打算自定义一个listadapter,一般常用的是继承baseadapter来实现里面的方法。我打算自己定义一个adapter深入学习adapter. 点开adapter的api文档,发现里面有一个void registerDataSetObserver...
  • Android源码中的观察者模式

    千次阅读 2016-08-23 23:57:42
    换一种说法,ListView的UI是观察者,ListView对应的adapter中的数据是被观察者,ListView通过注册一个观察者到adapter中,以实现监听adapter的数据变化的目的。经过刨祖坟一般的Ctrl+鼠标左键之后,画出如下UML类图...
  • JavaScript自定义事件--高级技巧

    千次阅读 2018-03-26 11:01:03
    观察者模式:由两对象组成,主体和观察者,主体负责发布事件,观察者通过订阅这些事件来观察主体。该模式的一个重要概念是主体并不知道观察者的任何事情,也就是说即使观察者不存在,主体也可以独自存在并正常运作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,617
精华内容 13,846
关键字:

自定义内容观察者继承的类的