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.<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>



执行效果:




其他

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值