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

相关文章

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是