編輯:關於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,需要重新跳到主線程中才能操作,以下是老外給出的幾種方案,大家多多學習下.private void loadIcon() {
我在開發的時候遇到了這樣的需求,就是在listview的滑動中,需要對頂部的欄目由透明慢慢的變為不透明的狀態,就是以下的效果最先開始的時候想的很簡單,無非就是監聽list
我有一篇文章很不負責的,沒有頭緒的分析了一些Volley的源碼。我自己回頭去看了一下,於是就把他刪掉了,於是就有了今天的這篇文章。Volley的使用步驟創建一個Reque
需要改變下拉狀態欄的背景色。關於這方面的代碼路徑 frameworks/base/packages/SystemUI中通過androidSDK自帶的工具uiautomat