Desc
? simpleLib 是筆者開發中積累下來,覺得高效好用的一些方法和限制整合。旨在幫助基于該類庫的開發者能夠高效的完成項目開發。
筆者基于 simpleLib 編寫了另一全棧項目 insomnia,可以通過查閱android端的代碼,了解simpleLib的使用。
項目持續疊代更新中,會繼續豐富類庫功能。
simpleLib 深度依賴以下開源類庫
- data-binding
- RxJava
- glide
- okHttp
- Gson
項目基本結構
└── simplelib
├── Const.java 類庫所需常量
├── LibCore.java 初始化核心
├── core
│ ├── AndroidHelper.java 裝置工具類集合
│ ├── CollectionHelper.java 集合工具類集合
│ ├── GlideAppModule.java glide配置
│ ├── GsonUtil.java json轉化
│ ├── ImageLoader.java 圖檔加載
│ ├── Logs.java 日志管理
│ ├── PrefHelper.java sharePreference管理
│ ├── Router.java 界面跳轉路由
│ ├── RxBus.java 事件管理
│ ├── RxHelper.java RxJava線程排程
│ └── UiHelper.java 界面工具集合
├── http
│ ├── OkHttpHelper.java okHttp管理
│ ├── SslCertHelper.java ssl信任
│ ├── callback 網絡回調簡單封裝
│ ├── cookie cookie管理
│ └── intercaptor 攔截器
├── model
│ ├── DeviceInfo.java 裝置資訊
│ └── event 事件key常量
├── ui
│ ├── BindingAdapters.java dataBindingAdapter
│ ├── activity activity界面基類
│ ├── adapter 基礎擴充卡
│ ├── fragment fragment界面基類
│ ├── interfaces 接口限制
│ └── web webView的簡單封裝處理
├── util
│ ├── CallBacks.java 基礎回調封裝
│ ├── StringHelper.java 字元串工具類集合
│ ├── ThreadHelper.java 線程排程工具類集合
│ └── UrlUtil.java Url工具類集合
└── view 自定義view集合
如何使用
1. 引入依賴,在 app/build.gradle 處添加依賴
或 clone 類庫作為項目的子子產品引用
2. 初始化類庫,在應用初始化處 初始化 simpleLib
public class App extends Application {
private static Application mInstance;
@Override
public void onCreate() {
super.onCreate();
App.mInstance = this;
// init Lib
LibCore.init(this, new LibCore.InfoSupport() {
@Override
public OkHttpClient getOkHttpClient() {
return HttpClientManager.getWrapClient();
}
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
@Override
public String getAppName() {
return mInstance.getPackageName();
}
@Override
public int getAppVersionCode() {
return BuildConfig.VERSION_CODE;
}
});
}
}
核心 - LibCore
simpleLib 的核心,進行初始化和依賴對象的指派, 由 InfoSupport 和 LibConfig 提供配置項
- InfoSupport 傳回基本且必須的參數
- LibConfig 配置關于樣式上的自定義
篇幅有限,更詳細的配置範例異步 詳細配置範例 檢視
應用層環境配置 - InfoSupport
傳入 應用層基礎的狀态。部分方法提供了預設實作,
- isDebug 應用層狀态
- getAppName 應用名
- getAppVersionCode 版本code
- getOkHttpClient 傳回應用層 okHttp Client,不複寫,則使用 SimpleLib 預設的 OkHttpClient 對象
- getLogEvents 日志事件回調,當 Logs 發生日志統計時,會回調,可以在這裡執行日志收集(比如 Bugly 收集)
- getRouterConfig 路由配置,如:某些需要登入權限的頁面會調用配置中的跳轉代碼
樣式自定義 - LibConfig
自定義的配置項,比如加載對話框,标題欄,頁面加載圖,加載失敗圖等。非必選的,不配置的話 會傳回預設的實作。
界面相關 - ui
ui提供了 基礎的 Activity 和 Fragment ,各級 Base 類通過實作接口友善上層業務互動時調用
接口
- BaseView 提供簡單的界面互動操作
- BaseStateView 提供界面狀态切換(加載、異常、空資料等)
- TitleBar 提供基本的标題欄操作
public interface BaseView {
void showError();
void showText(String string);
default void showText(@StringRes int string) {
showText(UiHelper.getString(string));
}
void showProgress(String string);
void showProgress();
void hideProgress();
}
public interface BaseStateView extends BaseView {
String LOADING = "Loading";
String NET_ERROR = "NetError";
String CONTENT = "Content";
String EMPTY = "Empty";
@StringDef({LOADING, NET_ERROR, CONTENT, EMPTY})
@Retention(RetentionPolicy.SOURCE)
@interface ViewType {
}
/** 切換不同的View狀态 */
void switchView(@ViewType String viewType);
}
實作
基類是有 RxJava 的 CompositeDisposable 成員變量,在執行網路互動、事件訂閱時需要調用 addSubscribe 将訂閱收集起來,會在 OnDestroy 時取消訂閱的回調。
- BaseActivity/BaseFragment 實作接口 BaseView 的基類。特别的,
- BaseStatefulActivity/BaseStatefulFragment 實作接口 BaseStateView 的基類
- BaseTitleBarActivity 提供簡單 TitleBar 操作的基類,該類通過委托類提供了 自定義的線性布局和Toolbar(暫未實作)兩種實作
- SimpleLazyFragment 懶加載的 Fragment,用于ViewPager 等,
核心基礎類 - Core
- Logs 日志類,包括日志輸出與日志收集
- RxBus 基于 RxJava 的事件總線
- PrefHelper 對 SharedPreferences 基本操作
- RxHelper 對 RxJava 一些方法調用封裝
- Router 對 Activity 跳轉和傳參的封裝
- UiHelper 界面相關操作的整合
- GsonUtil 對 Json 的操作
Logs
日志使用的預設的Log實作,其中 logEvent 和 logException 是作為日志事件收集(InfoSupport 需實作異常收集平台的收集代碼)使用的,便于異常發生時能夠回溯使用者的行為。
NOTE: 網絡請求預設輸出并上報異常到日志收集,具體請查閱http目錄下的 RequestLogInterceptor 和 RespExceptionLogInterceptor
RxBus
RxBus 基于 Rxjava 的事件訂閱,可以在任一線程 發送事件,事件可以為通用事件 CommonEvent,加上數字 Code 作為辨別,也可以通過特定對象傳遞大的事件資料。
簡單的事件傳遞 像這樣
// 發送事件
RxBus.get().postEvent(Constant.Code.LOG_IN);
// 訂閱事件
addSubscribe(RxBus.get().toObservable(event -> {
switch (event.getCode()) {
case Constant.Code.LOG_IN:
showText("Login");
break;
case Constant.Code.LOG_OUT:
showText("LogOut");
break;
case Constant.Code.SIGN_UP:
showText("SignUp");
break;
}
}));
RxHelper
RxHelper 提供了線程切換和結合基礎界面接口 BaseView/BaseStateView 的互動和狀态切換
- toMain 線程從 io 到 main 的切換
- getSwitchErrorConsumer 傳入 BaseStateView 切換視圖為網絡異常狀态
- getHideProgressConsumer 隐藏 加載框
- getErrorTextConsumer 彈出網絡異常文案
執行 Error consumer 均會觸發 Logs 的異常日志收集上報
我們來個簡單的網絡互動例子:
// 顯示 加載框,開始發起網絡請求
showProgress();
addSubscribe(RetrofitHelper.getApis().login(email, password)
.compose(RxUtil.rxSchedulerHelper())
.subscribe((respBean -> {
// 不論傳回啥,均取消加載框
hideProgress();
// 如果失敗,彈出異常文案
if (respBean.isCodeFail()) {
showText(respBean.getMsg());
return;
}
// 發送事件,登入成功
RxBus.get().postEvent(Constant.Code.LOG_IN);
}, RxUtil.getHideProgressError(this));
UiHelper
提供筆者認為能簡化代碼,提高效率的工具方法,
- dp2px/sp2px , getScreenWidth/Height dp轉化,螢幕寬高
- setVisibleElseGone(View,boolean) 傳入 true 顯示 visible,否則 gone
- runOnUiThread 使用主線程運作傳入的方法
- getDrawable/Color/String 擷取資源
Note: 部分需要 Context 的方法會使用 LibCore 傳入的上下文,無需調用者再傳入
其他目錄
- util 該子產品為基礎工具類的整合,包含均為核心常用方法
- view 一些筆者覺得能用且好用的 View,特别的 state 目錄下是 BaseStateView 狀态切換使用到的預設界面
- Const 類庫依賴的常量
Todo
- TitleBarDelegate 提供 Toolbar的添加右側按鈕 的實作
- 提供 MVVM 的支援(mvvm分支在嘗試),做到既可以簡單實用,又可以在複雜業務中使用 MVVM