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

来源:互联网 发布:安卓息屏录像软件 编辑:程序博客网 时间:2024/06/06 16:59

基本信息

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.<br> * Project Name : Virtual-Lightning Simple2Develop<br> * Since : VLSimple2Develop_0.1.8<br> * Description:<br> *//*监控全局状态,状态名为 “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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:id="@+id/state_tv"/>    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Click"        android:id="@+id/state_btn"/></LinearLayout>



执行效果:




其他

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




0 0
原创粉丝点击