編輯:關於Android編程
Simple2Develop 是一款基於Android平台的跨線程通信框架,可以讓你以一種簡單的方式進行復雜的通信,支持同進程中多Activity之間即時交互,子線程與主線程之間的交互等等。對通信的方式進行了解藕。
此框架已經上傳至 JCenter ,使用Gradle方式:
compile 'com.virtualightning.library.simple2develop:simple2develop:0.1.8'
項目Github托管:
https://github.com/CimZzz/Simple2Develop
在介紹之前首先看下結構圖

StateManager(狀態管理者)是一個單例,用於創建 StateRecord,目前暫無其他作用,只是作為一個Generator,將來可能會在此基礎上對 StateRecord 進行統一管理。
StateRecord(狀態記錄)是此框架的核心類,其中維護了一個全局靜態表用於存儲全局 StateMediator 和一個存儲監控 StateMediator 狀態的內部表,使用者可以通過狀態的解析生成監控的狀態(配合使用Analyzer)。
當監控的狀態為全局狀態時,會從全局靜態表內找到對應狀態並進行克隆,實現同一狀態的多重監控;如果監控狀態為私有狀態時,則會實例化一個新的 StateMediator 置入監控表內。(注意監控的狀態名應唯一)
InternalState(內部狀態)標識著 StateRecord 的狀態,用於判斷 StateRecord 當前的狀態,主要用於控制對Observer的通知時機。
Observer(狀態觀察者)作用是當其監控的狀態發生改變時所作出的響應操作。一個狀態只能對應一個Observer,並且 Observer 的操作始終運行在主線程。
State(狀態對象)保存著一個狀態值(true or false)和多個 StateMediator。當其中狀態發生改變時(無論狀態是否真正的改變),都會通知 StateMediator 將狀態發布給 Observer,最終由 Observer 決定此狀態事件是否執行相應的操作。
StateMediator ,再由其根據運行環境轉發給 Observer
MemoryObserver(記憶性狀態觀察者)是 Observer 的一個子類,作用是每次通知狀態變化時都會將最近的狀態進行保存,如果此次的通知的狀態與上一次狀態一致時,則不會執行其中操作
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-線程更新UI的幾個方式
如圖,Android上新開的線程如想更新UI,需要重新跳到主線程中才能操作,以下是老外給出的幾種方案,大家多多學習下.private void loadIcon() {
Android實現listview滑動時漸隱漸現頂部欄實例代碼
我在開發的時候遇到了這樣的需求,就是在listview的滑動中,需要對頂部的欄目由透明慢慢的變為不透明的狀態,就是以下的效果最先開始的時候想的很簡單,無非就是監聽list
android - Volley源碼分析
我有一篇文章很不負責的,沒有頭緒的分析了一些Volley的源碼。我自己回頭去看了一下,於是就把他刪掉了,於是就有了今天的這篇文章。Volley的使用步驟創建一個Reque
【SystemUI】修改下拉狀態欄顏色
需要改變下拉狀態欄的背景色。關於這方面的代碼路徑 frameworks/base/packages/SystemUI中通過androidSDK自帶的工具uiautomat