天天看點

simpleLib - android 快速開發架構Desc項目基本結構如何使用核心 - LibCore界面相關 - ui核心基礎類 - Core其他目錄Todo

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