正文

监听者模式(观察者模式)能降低对象之间耦合程度。为两个相互依赖调用的类进行解耦。

便于进行模块化开发工作。不同模块的开发者可以专注于自身的代码。

监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作。
在某些数据变化时,其他的类做出一些响应。处理数据(或者分发事件)的类主动投送消息,感兴趣的类主动“订阅”消息。

监听者模式在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。

以上就是Java与Android使用监听者模式示例的详细内容,更多关于Java Android监听者模式的资料请关注Devmax其它相关文章!

Java与Android使用监听者模式示例的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部