Android跨线程通信状态框架Simple2Develop【更新至0.2.0】

基本信息

Simple2Develop 是一款基于Android平台的跨线程通信框架,可以让你以一种简单的方式进行复杂的通信,支持同进程中多Activity之间即时交互,子线程与主线程之间的交互等等。对通信的方式进行了解藕。

配置方式

此框架已经上传至 JCenter ,使用Gradle方式:

compile 'com.virtualightning.library.simple2develop:simple2develop:0.2.0'

项目Github托管:

https://github.com/CimZzz/Simple2Develop


框架介绍


在介绍之前首先看下结构图




StateManager(Singleton)

StateManager(状态管理者)是一个单例,用于创建 StateRecord,目前暂无其他作用,只是作为一个Generator,将来可能会在此基础上对 StateRecord 进行统一管理。



StateRecord

StateRecord(状态记录)是此框架的核心类,其中维护了一个全局静态表用于存储全局 StateMediator 和一个存储监控 StateMediator 状态的内部表,使用者可以通过状态的解析生成监控的状态(配合使用Analyzer)。

当监控的状态为全局状态时,会从全局静态表内找到对应状态并进行克隆,实现同一状态的多重监控;如果监控状态为私有状态时,则会实例化一个新的 StateMediator 置入监控表内。(注意监控的状态名应唯一)

InternalState

InternalState(内部状态)标识着 StateRecord 的状态,用于判断 StateRecord 当前的状态,主要用于控制对Observer的通知时机。


Observer

Observer(状态观察者)作用是当其监控的状态发生改变时所作出的响应操作。一个状态只能对应一个Observer,并且 Observer 的操作始终运行在主线程。


State

State(状态对象)保存着一个状态值(true or false)和多个 StateMediator。当其中状态发生改变时(无论状态是否真正的改变),都会通知 StateMediator 将状态发布给 Observer,最终由 Observer 决定此状态事件是否执行相应的操作。

StateMediator

StateMediator(状态中介)会保存一个 State 的引用和一个 Observer 的弱引用。当状态发生变化时,StateMediator 会将变化的结果发送给 State 进行状态变化,然后 State 再将变化结果发布给所有监控此状态的
StateMediator ,再由其根据运行环境转发给 Observer


MemoryObserver

MemoryObserver(记忆性状态观察者)是 Observer 的一个子类,作用是每次通知状态变化时都会将最近的状态进行保存,如果此次的通知的状态与上一次状态一致时,则不会执行其中操作


PassiveObserver

PassiveObserver(被动状态观察者)是 Observer 的一个子类,作用是每次通知状态变化时都会执行其中操作。


以上就是此框架中核心的类。



框架使用

package com.virtualightning.simple2develop.state;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.virtualightning.library.simple2develop.state.AnalyzeGlobalState;
import com.virtualightning.library.simple2develop.state.AnalyzeState;
import com.virtualightning.library.simple2develop.state.AnalyzeView;
import com.virtualightning.library.simple2develop.state.Analyzer;
import com.virtualightning.library.simple2develop.state.PassiveObserver;
import com.virtualightning.library.simple2develop.state.StateManagement;
import com.virtualightning.library.simple2develop.state.StateRecord;
import com.virtualightning.library.simple2develop.ui.ActionBarUI;
import com.virtualightning.library.simple2develop.ui.ActionBarUICreater;
import com.virtualightning.simple2develop.R;

/**
 * Created by CimZzz on 16/8/24.
* Project Name : Virtual-Lightning Simple2Develop
* Since : VLSimple2Develop_0.1.8
* Description:
*/ /*监控全局状态,状态名为 “GS_0”*/ @AnalyzeGlobalState(StateRecordActivity.GLOBAL_STATE_0) /*监控私有状态,状态名为 “0” ,初始状态为 true*/ @AnalyzeState( stateNames = {StateRecordActivity.STATE_0}, states = {true} ) public class StateRecordActivity extends ActionBarUI { public static final String GLOBAL_STATE_0 = "GS_0";//全局状态 public static final String STATE_0 = "0";//私有状态 private StateRecord stateRecord;//状态记录 /*使用注解快速绑定控件*/ @AnalyzeView(R.id.state_tv) private TextView tv; @AnalyzeView(R.id.state_btn) private Button btn; @Override protected void onBaseUICreate(ActionBarUICreater creater) { creater.setLayoutID(R.layout.state); /*注册全局状态,建议在自定义 Application 类中进行此操作,状态名最好使用静态常量声明*/ StateRecord.registGlobalState(GLOBAL_STATE_0,true);//注册一个全局状态,状态名为 “GS_0” ,初始状态为 true /*通过状态管理生成一个临时的状态记录*/ stateRecord = StateManagement.getInstance().getTempStateRecord(null); } @Override protected void onViewInit(Bundle savedInstanceState) { /*根据注解解析控件并绑定控件*/ Analyzer.analyzeView(this); /*根据注解监控状态*/ Analyzer.analyzeState(stateRecord,this); /*为 Button 注册一个事件*/ btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /*启动一个线程模拟耗时处理*/ new Thread(new Runnable() { @Override public void run() { /*模拟通过耗时操作获得结果*/ String result = "123456"; /*通知私有状态发生改变,改变后状态为 true,附加额外的参数为一个字符串*/ stateRecord.changeState(STATE_0,true,result); } }).start(); } }); /*注册状态观察者*/ /*注册一个活性状态观察者(当 StateRecord 的内部状态每次变更为 RunState 时,都会自动激活状态观察者)*/ /*将状态观察者绑定给监控的全局状态*/ /*PassiveObserver 为被动状态,表示每次状态激活时都会执行对应状态的操作,其构造参数表示当 StateRecord 处于非 RunState 时,不执行操作*/ stateRecord.registActiviteObserver(GLOBAL_STATE_0, new PassiveObserver(false) { /*当处于 true 状态时执行的操作*/ @Override protected void trueStateUpdate(Object... arg) { /*将 TextView 的文本置为 HelloWord */ tv.setText("HelloWord!"); } /*当处于 false 状态时执行的操作*/ @Override protected void falseStateUpdate(Object... arg) { //不执行任何操作 } }); /*注册一个惰性状态观察者(当 StateRecord 的内部状态每次变更不会自动激活状态观察者)*/ /*将状态观察者绑定给监控的私有状态*/ /*PassiveObserver 为被动状态,表示每次状态激活时都会执行对应状态的操作,其构造参数表示当 StateRecord 处于非 RunState 时,不执行操作*/ stateRecord.registInactiveObserver(STATE_0, new PassiveObserver(false) { /*当处于 true 状态时执行的操作*/ @Override protected void trueStateUpdate(Object... arg) { /*将 TextView 的文本置为传递过来的参数 */ String result = (String) arg[0]; tv.setText(result); } /*当处于 false 状态时执行的操作*/ @Override protected void falseStateUpdate(Object... arg) { //不执行任何操作 } }); } /*监控状态记录内部状态回调*/ @Override protected void onResume() { super.onResume(); /*当宿主处于继续状态时,StateRecord变更状态为 RunState */ stateRecord.setRunState(); } @Override protected void onPause() { super.onPause(); /*当宿主处于暂停状态时,StateRecord变更状态为 StopState */ stateRecord.setStopState(); } @Override protected void onDestroy() { super.onDestroy(); /*当宿主处于暂停状态时,StateRecord变更状态为 DestoryState */ stateRecord.setDestroyState(); } }




state.xml



    
    



执行效果:




其他

使用此框架大大减少了类与类之间密切的耦合,提高了代码的可阅读性和明确性。有什么需要改进的地方还请多多指教,大家共同学习。如果您有更好的想法欢迎您踊跃参与其中,我会认真考虑您的建议,谢谢~~~




你可能感兴趣的:(android,设计模式)