专栏首页AnRFDev监听者模式 - 在Java与Android中的使用

监听者模式 - 在Java与Android中的使用

监听者模式(观察者模式)能降低对象之间耦合程度。为两个相互依赖调用的类进行解耦。 便于进行模块化开发工作。不同模块的开发者可以专注于自身的代码。 监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作。 在某些数据变化时,其他的类做出一些响应。处理数据(或者分发事件)的类主动投送消息,感兴趣的类主动“订阅”消息。

监听者模式在Android中有大量的运用,相信大家都不会感到陌生。在Android开发中,Button控件的点击事件就是监听者模式最常见的例子。 当Button被点击,执行了 OnClickListener.onClick。 Activity中给这个Button设置了自己实现的OnClickListener,并复写了onClick方法,就能执行自定义操作了。

Java代码实例

下面来用Java来实现监听者模式。 这个例子是给“计算类”持续地传入数据,处理好数据后,发出结果。感兴趣的类接收结果。 2个文件:AlgoCalculator.javaMainUser.java

  • AlgoCalculator.java是计算部分,接收数据并进行计算。并将结果传递出去。
  • MainUser.java是调用方,将基本数据传入AlgoCalculator并监听结果。
package com.algo;

import java.util.LinkedList;
import java.util.List;

public class AlgoCalculator {

    private List<short[]> mDataBuffer = new LinkedList<>();

    public AlgoCalculator() {

    }

    // 定义一个Listener接口;可将一个boolean值传递出去
    public interface ResultChangeListener {
        void onChange(boolean found);
    }

    private ResultChangeListener resultChangeListener;
    // 调用方能够设置并实现这个接口
    public void setResultChangedListener(ResultChangeListener resultChangedListener) {
        this.resultChangeListener = resultChangedListener;
    }
    // 传输数据
    public void setDataStream(short[] data) {
        checkData(data);// 处理数据方法
    }

    // 处理数据,并送出结果
    private void checkData(short[] data) {
        if (data.length == 0) {
            return;
        }
        long sum = 0;
        for (short b : data) {
            sum += b;
        }
        if (sum > 40) {
            resultChangeListener.onChange(true); // 数据处理结果
        } else {
            resultChangeListener.onChange(false);
        }
    }
}

主程序;调用方传入数据,获取结果

import com.algo.AlgoCalculator;

public class MainUser {
    public static void main(String[] args) {
        AlgoCalculator algoCalculator = new AlgoCalculator(); // 初始化

        // 设置监听器,并在里面增加要执行的动作
        algoCalculator.setResultChangedListener(new AlgoCalculator.ResultChangeListener() {
            @Override
            public void onChange(boolean found) {
                System.out.println("result: " + found);
            }
        });
        short[] data1 = {1, 2, 3,};
        short[] data2 = {10, 20, 30};
        short[] data3 = {6, 7, 8};
        short[] data4 = {1, 1, 1};
        // 传入数据
        algoCalculator.setDataStream(data1);    // output false
        algoCalculator.setDataStream(data2);    // output true
        algoCalculator.setDataStream(data3);    // output false
        algoCalculator.setDataStream(data4);    // output false
    }
}

在另外的类里,能够很方便地调用AlgoCalculator的计算能力并获取计算结果。

在这里,每传入一次数据,就能获取一个结果。如果每秒钟传入一次数据,每秒钟就能获取一个结果。

我们可以把复杂的算法封装起来,客户端只需要传入数据,即可获得(监听到)结果。

很多场景中都使用了监听者模式。开发者也可能在不知不觉中就运用了这个模式。

Android中使用监听器

最常见的例子是给Button设置点击事件监听器。 类似上个例子,设计一个接口当做监听器。Android中回调时可以利用handler,控制调用的线程。

private Handler mMainHandler;

mMainHandler = new Handler(Looper.getMainLooper());// 在主线程中运行

private void notifySthChange(final int state) {
    mMainHandler.post(new Runnable() {
        @Override
        public void run() {
            ArrayList<SListener> list = new ArrayList<>(mListeners);
            for (SListener l : list) {
                l.OnSthChanged(state);
            }
        }
    });
}

在回调中可以直接更新UI。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android使用观察者模式Observer实现网络状态监听

    在Android开发过程中,很多时候都会用到当前网络的状态判断以及网络状况发生变化的时候做出相应的反应,要想监听网络状态,用观察者模式再合适不过了,废话不多说,...

    砸漏
  • Android事件处理概述

    通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件、选框的状态切换事件。 一、Android事件处理 ...

    分享达人秀
  • 业务解耦-事件监听模式的使用

    事件监听机制有点类似于sub/pub模式,不过这个技术点也仅适用于单体应用的范围,分布式应用还是老老实实使用消息队列来进行吧。

    码农王同学
  • Android事件处理机制

    用户1907613
  • 访问者模式在ASM框架中的使用

    访问者模式的定义是:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    Java艺术
  • Android开发之RadioGroup的简单使用与监听示例

    本文实例讲述了Android RadioGroup的简单使用与监听。分享给大家供大家参考,具体如下:

    砸漏
  • 观察者模式与它在源码中的运用

    观察者模式定义对象间的一种一对多的依赖关系,当被观察的对象发生变化时,所有的观察者都将得到通知进行相应的操作

    爬蜥
  • Android中基于回调的事件处理

    通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理。 一、基于回调的事件处理概述 ...

    分享达人秀
  • Android Studio 知识储备 之 ✨-基础知识学习历程

    所有的资源文件都会在R.java文件下生成对应的资源id,我们可以直接通过资源id访问到对应的资源。使用mipmap会在图片缩放在提供一定的性能优化,分辨率不同...

    呆呆敲代码的小Y
  • Android监听自身卸载,弹出用户反馈调查

    1,情景分析         在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用...

    xiangzhihong
  • Kotlin入门(2)让App开发变得更容易

    上一篇文章介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android St...

    用户4464237
  • Android Listener侦听的N种写法

    Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法。

    阳光岛主
  • 蓝牙项目开发流程

    用户1733354
  • Android开发笔记(八十六)几个特殊的类

    interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供。Android对接口的使用场景...

    用户4464237
  • Android开发(19) 使用adb建立pc和android设备之间的连接

    在我开发过的android应用中,大多都需要和 远程服务端 进行交互,需要从服务端获得数据或者上传数据。 那样我们的app(android 应用程序,以下简写...

    zhangyunfeiVir
  • 架构设计基础知识整理

    From http://msdn.microsoft.com/en-us/library/ff647859.aspx

    哲洛不闹
  • Android 知识简记:资深架构师带你快速回顾Android各种知识!

    1.网络 2.Java 基础&容器&同步&设计模式 3.Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理 4.Android 基础&性能优化&...

    Android技术干货分享
  • Android Data Binding(数据绑定)用户指南

    1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件。 Data B...

    庞小明
  • Android中基于监听的事件处理

    上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本期继续来学习其他四种事件监听...

    分享达人秀

扫码关注云+社区

领取腾讯云代金券