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