otto框架使多个类之间解耦

2024-08-24 22:48
文章标签 框架 多个 之间 otto

本文主要是介绍otto框架使多个类之间解耦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

otto框架使多个类之间解耦

最近发现了一个很有趣的框架,可以用来使得多个类之间解耦。看起来十分玄乎,其实举个例子就明白了。比如,一个聊天应用,服务器推送来了一条信息,信息通知栏会出现未读通知,但是接收信息的类和显示通知的类是不同的类,如果显示通知的类使用接受信息的类的方法,那么这两个类就耦合了,显然这是不好的,我们应该避免这种耦合,这时候,otto框架就派上用场了!咦,怎么感觉broadcastreceiver也是做这种事的呢!是的,broadcastreceiver也可以做到,但是很多场合,从开发效率,设计思路上来说,otto都要优于 broadcastreceiver,所以otto是非常值得学习的,最近看了一下关于otto的资料,发现好多看不懂,后来自己看看官方的文档和其他人的学习资料,然后自己总结一下,然后自己写一个demo。
  导入方法:eclipse下载jar包,然后导入。
  android studio在build.gradle中加上compile 'com.squareup:otto:+'

一,Bus建立单例

官方文档这么说:如果Bus是被分享的,它才能表现出它的效率,我们推荐通过注入或者其他合适的机制获得Bus的实例。
Bus类就是这个框架主要的类,用于发布消息,注册订阅,注销订阅等,官方文档这么说,也就是推荐我们把Bus做出单例。代码如下:
public class BusSingle {private static final Bus bus = new Bus(ThreadEnforcer.MAIN);public static Bus getInstance(){return bus;}private BusSingle(){}
}
单例,谁都看得懂,唯一疑惑的是ThreadEnforce.Main到底是什么呢?其实看字面意思也可以看出,就是这个单例只能在主线程上,ThreadEnforce还有另一个参数Any,这个参数允许任意线程。

二,订阅事件

首先是布局文件,很简单,一个按钮就可以了,代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><Buttonandroid:id="@+id/textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="next" /></RelativeLayout>

这个activity主要是订阅事件,接收到另外一个activity的事件,它就响应,并打印log,按钮一按,就跳到发布事件的activity。代码如下:
package com.example.admin.studypercent;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;public class MainActivity extends ActionBarActivity {private Bus bus = BusSingle.getInstance();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bus.register(this);findViewById(R.id.textview).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this,SecondActivity.class));}});}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected void onPause() {super.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();bus.unregister(this);}@Subscribepublic void sayEventOccur(String event) {Log.e("event", "mainactivity" + event);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

bus实例一定要注册,activity被销毁的时候要注销bus,代码
 @Subscribepublic void sayEventOccur(String event) {Log.e("event", "mainactivity" + event);}
就是收到事件作出响应的函数,如果控制台打印log说明成功了。

三,发布事件

发布事件的activity布局和第一个activity基本一样,代码如下:、
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><Buttonandroid:id="@+id/textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="occur" /></RelativeLayout>
然后就可以看看发布的方法了,很简单,直接获得bus实例,然后使用post方法就可以了,代码如下:
package com.example.admin.studypercent;import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;import com.squareup.otto.Bus;public class SecondActivity extends ActionBarActivity {private Bus bus = BusSingle.getInstance();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);findViewById(R.id.textview).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {bus.post("hello");}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

四,运作流程

首先mainactivity注册bus,并有一个注解函数,用于响应事件发生,然后mainactivity跳转到secondactivity,按钮点击触发事件,失去焦点的mainactivity响应,调用注解函数,打印日志,关闭程序,mainactivity销毁的之前bus注销,程序结束。

五,效果


六,总结

这是个不错的框架,使得类之间解耦,值得学习,是个不错的框架。
demo下载地址:http://download.csdn.net/detail/u013013970/8894557

这篇关于otto框架使多个类之间解耦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103828

相关文章

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization