by hzwusibo 20181118
(書(shū)架重構(gòu)基本按照《書(shū)架重構(gòu)設(shè)計(jì)文檔》來(lái)實(shí)現(xiàn), 本文主要是對(duì)于設(shè)計(jì)文檔的實(shí)現(xiàn)方案的一些補(bǔ)充與問(wèn)題的記錄。)
? ? ? ? ? 云閱讀產(chǎn)品的歷史比較長(zhǎng),書(shū)架模塊沒(méi)有進(jìn)行過(guò)大的更新,難以擴(kuò)展與維護(hù),且其他的模塊對(duì)書(shū)架模塊的依賴(lài)比較嚴(yán)重,耦合較強(qiáng),影響用戶(hù)體驗(yàn),后期的開(kāi)發(fā)成本高。并且閱讀項(xiàng)目是 myeclipse時(shí)代升級(jí)而來(lái),并要之前兼容pad版本,工程結(jié)構(gòu)不是android的標(biāo)準(zhǔn)工程結(jié)構(gòu)。???? 剛好有機(jī)會(huì),我們團(tuán)隊(duì)決定對(duì)書(shū)架進(jìn)行一次重構(gòu),經(jīng)過(guò)團(tuán)隊(duì)的討論決定對(duì)項(xiàng)目進(jìn)行一些初步的模塊化。
一、客戶(hù)端模塊分層
? ? ? ? ?將書(shū)架模塊、正文模塊、搜索等不相干業(yè)務(wù)相互獨(dú)立,(每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容 )通過(guò)Arouter路由進(jìn)行通訊。
1、各業(yè)務(wù)模塊之間不允許存在相互依賴(lài)關(guān)系,它們之間的跳轉(zhuǎn)通訊采用路由框架Router來(lái)實(shí)現(xiàn)
2、對(duì)于業(yè)務(wù)模塊, 單一業(yè)務(wù)組件只能對(duì)應(yīng)某一項(xiàng)具體的業(yè)務(wù),個(gè)性化需求對(duì)外部提供接口讓調(diào)用方定制;
(各業(yè)務(wù)模塊間肯定會(huì)有公用的部分,公用的部分我們會(huì)根據(jù)業(yè)務(wù)相關(guān)性下放到業(yè)務(wù)組件層或者基礎(chǔ)組件層。)
?1、框架服務(wù)層: 包括各種業(yè)務(wù)無(wú)關(guān)的基礎(chǔ)的組件,如網(wǎng)絡(luò)、圖片、通訊、工具類(lèi)等。
?2、業(yè)務(wù)模塊層:書(shū)架、閱讀器等。
?3、應(yīng)用層:主界面的框架,組裝業(yè)務(wù)模塊。
好處:
1、多團(tuán)隊(duì)并行開(kāi)發(fā)測(cè)試;
2、模塊間解耦、重用;
3、可單獨(dú)編譯打包某一模塊,提升開(kāi)發(fā)效率。
?????????在我們實(shí)現(xiàn)的過(guò)程中,遇到了一些問(wèn)題,這是目前的初步模塊化結(jié)構(gòu)圖,最終實(shí)現(xiàn)時(shí)業(yè)務(wù)層的搜索沒(méi)有拆分成module,本來(lái)打算管理公共數(shù)據(jù)模型的module_common_model暫時(shí)沒(méi)有使用,因?yàn)槟壳肮玫臄?shù)據(jù)模型還無(wú)法完全剝離,暫時(shí)還是放在module_base中,?另外模塊通信層目前看算是各個(gè)業(yè)務(wù)依賴(lài)的中間層,通信用到的數(shù)據(jù)模型都放在了module_communication中。? 后期我們會(huì)在不斷的重構(gòu)迭代中視情況進(jìn)行進(jìn)一步的拆分。
? ? ? ? 客戶(hù)端模塊分層后的工程結(jié)構(gòu):base基礎(chǔ)的組件、 book_shelf書(shū)架、communication模塊之間通訊等。
? ? ? ? ? 對(duì)業(yè)務(wù)進(jìn)行模塊化拆分后,為了使各業(yè)務(wù)模塊間解耦,因此各個(gè)Module 都是獨(dú)立的模塊,它們之間是沒(méi)有依賴(lài)關(guān)系,對(duì)業(yè)務(wù)進(jìn)行模塊化拆分后,為了使各業(yè)務(wù)模塊間解耦,因此各個(gè)Module 都是獨(dú)立的模塊,它們之間是沒(méi)有依賴(lài)關(guān)系。
? ? ? ? 模塊之間的通訊通過(guò)Arouter的服務(wù)管理實(shí)現(xiàn), 以書(shū)架為例
1、暴露書(shū)架對(duì)外提供的服務(wù)(聲明接口,其他組件通過(guò)接口來(lái)調(diào)用書(shū)架的服務(wù)),接口統(tǒng)一在module_communication模塊中聲明,例如這里書(shū)架暴露了void addShelfBook(String id);接口。
2、在書(shū)架模塊中實(shí)現(xiàn)外提供的服務(wù)的接口
3、其他模塊調(diào)用,如購(gòu)物車(chē)模塊調(diào)用書(shū)架提供的加入服務(wù)。
補(bǔ)充:? 書(shū)架模塊對(duì)外接口:
二、書(shū)架模塊內(nèi)部架構(gòu)
書(shū)架主要分為三層、 BookBean(對(duì)應(yīng)數(shù)據(jù)庫(kù))、ShelfItemData(對(duì)應(yīng)內(nèi)存)、 ShelfModel(對(duì)應(yīng)界面)
BookBean? (和書(shū)架數(shù)據(jù)庫(kù)一一對(duì)應(yīng), 用于網(wǎng)絡(luò)獲取、數(shù)據(jù)庫(kù)存儲(chǔ))
ShelfItemData 列表為內(nèi)存中數(shù)據(jù)(是 DB 讀取,進(jìn)行處理后(分組、分區(qū)、排序)的數(shù)據(jù) list)。
ShelfModel?只用于顯示(從 ShelfItemData 層生成),類(lèi)似于 MVVM 中的 ViewModel。
ManagerShelf?進(jìn)行對(duì) ShelfItemData 層數(shù)據(jù)進(jìn)行管理操作(置頂、分組、刪除等),操作完成后更新 ShelfModel界面層與 DB 。
? 備注 :? BookBean、ShelfItemData)、 ShelfModel中詳細(xì)字段可見(jiàn)最后附錄一
書(shū)架模塊工程結(jié)構(gòu):
communication主要是書(shū)架對(duì)外接口的實(shí)現(xiàn)、 db數(shù)據(jù)庫(kù)、 ui界面、eventbus模塊內(nèi)部通訊、config配置常量、 manager操作(manager分為對(duì)數(shù)據(jù)的操作、對(duì)ui的操作、對(duì)網(wǎng)絡(luò)的操作)、util書(shū)架中專(zhuān)用的工具。
書(shū)架模塊類(lèi)圖:
三、Manager中關(guān)健實(shí)現(xiàn)
manager的實(shí)現(xiàn)是書(shū)架中最重要的部分、基本按照《書(shū)架重構(gòu)設(shè)計(jì)文檔》進(jìn)行實(shí)現(xiàn),本文主要進(jìn)行補(bǔ)充。
3.1 data包
1、 ShelfManagerUtil 是書(shū)架基本操作的專(zhuān)屬工具類(lèi),? protected static 方法(分組函數(shù)、 排序、分區(qū)、合并置頂和非置頂區(qū)數(shù)據(jù)、新建一個(gè)組、多本書(shū)加入一個(gè)組、加入一個(gè)組、移出分組等方法)
2、ShelfManager? 實(shí)現(xiàn)書(shū)架的各種操作,如初始化數(shù)據(jù)、刪除圖書(shū)、移動(dòng)書(shū)籍位置、置頂、取消置頂、創(chuàng)建組、 加入對(duì)應(yīng)的組、從組中刪除、判斷書(shū)是否在書(shū)架上等。
void cancleTopPart(ShelfModel shelfModel){
? ? ? 1、ShelfManagerUtil..addTopPart(shelfItemData);
? ? ? 2、獲取重新排列和設(shè)置新order的數(shù)據(jù)
? ? ? 3、更新數(shù)據(jù)庫(kù) (異步)
? ? ? 4、通知 顯示刷新(主界面、 組內(nèi), 批量刪除界面)
? ? ? 5、saveGroupInfo?
}?
ShelfManager 中流程基本相似,? 以取消置頂為例,會(huì)先調(diào)用 ShelfManagerUtil工具類(lèi)中的cancelTopPart方法,對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作, 內(nèi)心更新后,會(huì)異步更新數(shù)據(jù)庫(kù),并且通知ui刷新與上報(bào)后端,位置變化。
3、ShelfManagerUpdate? 和ShelfManager類(lèi)似,主要是一些更新的操作,比如更新書(shū)籍閱讀進(jìn)度、更新是否是語(yǔ)音閱讀、更新章節(jié)本地更新時(shí)間等。
4、ShelfManagerBookBean? 主要是與后端有交互的業(yè)務(wù)方法如 getinfo、getdetai、addshelf等, 后端返回的Bookbean,主要流程也是后端回來(lái)bookbean, 根據(jù)條件更新內(nèi)存與DB,通知界面刷新(info回來(lái)有些不一樣, 直接更新DB, 在init重新讀取DB到內(nèi)存中)
3.2 net包
主要包括以下這幾種方法:
主要注意
1、 加入書(shū)架的回調(diào)? addShelfCallBack
使用的是觀察著模式,加入書(shū)架需要回調(diào)的地方添加監(jiān)聽(tīng), 如果發(fā)生了加入書(shū)架事件,所有注冊(cè)的地方都能收到回調(diào)。
2、由于書(shū)架在主界面,網(wǎng)絡(luò)回調(diào)回來(lái)后需要釋放掉,防止內(nèi)存泄露。
例如刪除上報(bào),成功后,需要remove掉網(wǎng)絡(luò)請(qǐng)求。
3.3 ui包
ManagerBookManage批量操作的一些輔助工具類(lèi)
ManagerBookOperate 長(zhǎng)按書(shū)架書(shū)菜單的管理類(lèi)
ShelfModelsUtil ShelfItemData 生成 ShelfModel? list
ManagerShelfModel ShelfItemData 生成 ShelfModel 具體過(guò)程
四、書(shū)架操作數(shù)據(jù)庫(kù)
ManagerBookDao 主要對(duì)數(shù)據(jù)庫(kù)更新進(jìn)行管理: 主要包括以下方法。
1、 deleteBooks(String userName,ist<BookBean> bookBeans)? 刪除數(shù)據(jù)
2、updateBookBean(String userName,BookBean bookbean) 更新數(shù)據(jù)
3. updateBookBeans(String userName,ist<BookBean> bookBeans) 批量更新
3、addBooks(String userName,List<BookBean> bookBeans)? add數(shù)據(jù)
4、queryBooks(String userName)? 查詢(xún)數(shù)據(jù)
...? ....?
五. UI主界面設(shè)計(jì)
? ? 書(shū)架界面不是此次重構(gòu)的核心,所以很多地方沿用老的設(shè)計(jì),? 對(duì)新的結(jié)構(gòu)進(jìn)行了適配與整理,梳理下來(lái),主要包括以下展示的類(lèi)。
? 越紅色越重要, BookShelf為書(shū)架主要最重要的類(lèi),ShelfListAdapter和ShelfGridAdapter為書(shū)架的adapter。? BookGroupDialog為組內(nèi)書(shū)的彈出框,BookGroupDialogAdapter為相應(yīng)的adapter。? 以上5個(gè)類(lèi)是書(shū)架最核心的類(lèi)。? BookOperateGroup為分組操作, BookManageActivity為批量操作, BookOperatePopWindow為書(shū)籍長(zhǎng)按操作彈框 。? ? 綠色的部分為推展功能, ShelfFilterPopWindow為篩選框, BookRecommendPopWindow為書(shū)架推薦。
工程結(jié)構(gòu):
BookShelf為書(shū)架主要最重要的類(lèi),adapter適配器、 Filter左上角篩選、group是組的彈窗與分組管理、menu是顯示彈出的書(shū)籍主菜單、Operate書(shū)架書(shū)籍長(zhǎng)按操作、recommend是書(shū)架推薦模塊、view是書(shū)架的一些自定義view。
六. 本地書(shū)同步的處理
首先看看同步的關(guān)健步驟(同設(shè)計(jì)文檔)
1、更新數(shù)據(jù)庫(kù)
2、通知 顯示界面重新從數(shù)據(jù)庫(kù)讀到內(nèi)存, 再 initBookData (主界面、 組內(nèi), 批量刪除界面),更新界面
本地書(shū)的處理(本期沿用老的策略):
? ? ? ? 除了本地書(shū), 其他書(shū)根據(jù)操作時(shí)間戳的大小,更是最后的順序(info接口不修改本地書(shū)內(nèi)容), 如果info接口回來(lái)時(shí)間戳大于本地時(shí)間戳,以info回來(lái)接口為準(zhǔn), 更改非本地書(shū)的order值, 此時(shí)本地書(shū)的order值不會(huì)變, 排序的時(shí)候按照order來(lái)進(jìn)行排序?
? 例如, 原來(lái)本地order為? ? - 5? -4? -3(本地書(shū))? -2? -1? , 服務(wù)器時(shí)間戳更新,order為? -6? -5? ? -3? -2? ? , 本地書(shū)order沒(méi)有被修改還是-3, 此時(shí)排序?yàn)?-6? -5? ? -3? -3(本地書(shū)) -2? 或者? -6? -5? ? -3 (本地書(shū))? -3 -2? 。
七、其他
7.1 斷網(wǎng)重連后,需要同步的數(shù)據(jù):
1、書(shū)架同步所有書(shū)籍狀態(tài):
網(wǎng)絡(luò)狀態(tài)變化后, 書(shū)架接受到廣播通知? SHELF_OPERATE_DATA_UPLOAD
書(shū)架接收到通知:
a、本地操作上傳服務(wù)器(savegroup等)
b、對(duì)刪除操作進(jìn)行上報(bào)
2、書(shū)簽
3、筆記功能
4、閱讀時(shí)長(zhǎng)
7.2 書(shū)架接收到廣播:
1、登陸登出
a、reLoadDataWhenSwitchAccount();切換用戶(hù)數(shù)據(jù)
b、獲取書(shū)架彈窗推薦
2、網(wǎng)絡(luò)狀態(tài)變?yōu)橛芯W(wǎng)的操作
見(jiàn)7.1
3、書(shū)架fragment被選中
a、替換tab更新時(shí)間
7.3? 書(shū)架跳轉(zhuǎn)外部:
1、BookShelfFragment? onclick?
a、搜索
b、閱讀歷史
c、去書(shū)城頁(yè)
2、ShelfFilterAdapter.OnShelfFilterItemClickListener
a、查看一本包月詳情
3、長(zhǎng)按一本書(shū)
a、詳情
b、下載
4、BookManagerActivity
a、去書(shū)城
7.4 本地書(shū)同步:
Main界面監(jiān)聽(tīng)上傳書(shū)成功回調(diào),通過(guò)書(shū)架提供的對(duì)外接口,更新書(shū)架表信息(正文與歷史記錄也需要做相應(yīng)的更新)
7.5 離線刪除上報(bào)問(wèn)題:
在sp中保存未上報(bào)成功的刪除json string
上報(bào)時(shí)機(jī):
1、每次啟動(dòng)app
2、監(jiān)聽(tīng)到有網(wǎng)絡(luò)變化時(shí)候
如果sp不為null, 進(jìn)行上報(bào)
上報(bào)成功后設(shè)置為null
每次刪除,如果上次未上報(bào)成功,會(huì)先取出上次還未成功的json,把當(dāng)前的id添加在后面。
7.6? BookState問(wèn)題::
外界更改書(shū)架狀態(tài): 界面需要 BookState? 字段?
1、downloadOneBookAllCatalog(BookState state)? 下載不使用Bookstate了 ,默認(rèn)設(shè)置5%
附錄一:
BookBean? (和書(shū)架數(shù)據(jù)庫(kù)一一對(duì)應(yīng), 用于網(wǎng)絡(luò)獲取、數(shù)據(jù)庫(kù)存儲(chǔ))
ShelfItemData(數(shù)據(jù)處理) :
private String mSourceType;// 大的類(lèi)型,包月,普通書(shū)
private int mZoneType;// 置頂或者非置頂
private boolean sGroup;//是否是一個(gè)組
private boolean isInGroup;// 是否在一個(gè)組內(nèi)
private List<ShelfItemData> mChildren = new ArrayList<>();// 如果是組,組內(nèi)書(shū)
private int mOrder;// 組的order為children中最小
private boolean isSorted;// 是否排過(guò)序
private int mConer;//? 角標(biāo) 0: 沒(méi)有 1: 限時(shí)暢讀 2: 節(jié)選 3: 包月
private int mBaoyueCount;//? 包月的數(shù)量
private long mBaoyueExpires;//? 包月到期的時(shí)間
private String mid;// Id
private String mTitle;// 標(biāo)題
private String mCover;// 封面
private String mAuthor;// 作者
private String mAnchor;// 播者
private int mPublicType;// 書(shū)籍發(fā)布類(lèi)型: -1: 未同步過(guò)得本地書(shū) 0: 原創(chuàng)書(shū) 1 :出飯 2 : 同步過(guò)得本地書(shū) 21: 音頻書(shū)
private boolean isLocalBook;//? 是否是本地書(shū)
private boolean isUploadBook;// 是否是上傳書(shū)
private boolean isAudioBook;// 是否是音頻書(shū)
private String mUpdateTitle;// 最新的章節(jié)標(biāo)題
private int mUpdateCount;// 更新的章節(jié)總數(shù)
private int mTotalCount;// 總章節(jié)數(shù)
private long mBookUpdateTime;// 書(shū)籍更新時(shí)間
private long mBookUpdateTimeLocal;//? 服務(wù)端獲取的書(shū)籍更新時(shí)間
private float mTotalPercent;// 整本書(shū)閱讀的百分比
private int mReadCount;// 已讀章節(jié)
private long mProgressTime;// 進(jìn)度更新時(shí)間
private String mGroupId;//? groupid
private String mGroupName;// groupName
private long mSubRecordTime;// 什么時(shí)候訂閱的時(shí)間戳,與數(shù)據(jù)庫(kù)中record_time一致
private int mBookFreeReadFromNewWelfare;//? 1表示來(lái)自新手福利,此時(shí)不需要顯示免費(fèi)角標(biāo)
private int mIsRecommendBook;//? 書(shū)架書(shū)籍是否是推薦書(shū)籍: 0 不是 1 是
private int isVoiceReading; // 0: 不是語(yǔ)言閱讀 1: 是語(yǔ)言閱讀
private int isReading;// 客戶(hù)端字段是否已經(jīng)閱讀 0: 沒(méi)有閱讀過(guò),取服務(wù)端時(shí)間? 1: 已經(jīng)閱讀過(guò),不在取服務(wù)端時(shí)間
private int integrity;// 是否連載完成? 1: 完結(jié) 3: 連載
public int updateState;
private int mBookType; // 書(shū)籍來(lái)源
private int mOpenBookType = -1; // 打開(kāi)書(shū)籍的type 0普通書(shū),1雜志, 2pdf 默認(rèn)-1
ShelfModel(顯示)?:
private String mid;
private List<ShelfModel> mChildren = new ArrayList<>();// 如果是個(gè)組,組內(nèi)書(shū)
private String mCover;// 封面的url
private String mTitleText;//? 標(biāo)題
private String mListSecondText;// 作者,播者,或者更新章節(jié)名,共幾本
private String mListThirdText;// 進(jìn)度,包月剩余時(shí)間/已過(guò)期
private String mGridSecondText;// 進(jìn)度,共幾本
private String mRemindUpdateCount;// 更新章節(jié)
private Drawable mConerRes;// 角標(biāo)資源,沒(méi)有為-1
private boolean mChecked;// 是否被選中
private boolean showTopTag;//? 是否顯示置頂圖標(biāo)
private boolean isAudioBook;// 是否顯示音頻書(shū)圖標(biāo)
private boolean isTtsPlayer;// 是否tts繼續(xù)播放圖標(biāo)
private String mSourceType;//? 大的類(lèi)型,包月,普通書(shū)
private boolean isGroup;// 是否是一個(gè)組
private boolean isInGroup;// 是否在一個(gè)組內(nèi)
private boolean isShowDownloadProgress;// 是否顯示下載進(jìn)度
private int mPublicType;? ? // 書(shū)籍發(fā)布類(lèi)型? ? -1 (未同步的本地書(shū)) 0 (原創(chuàng))、? 1 (出版) 、 2? (已同步的本地書(shū))? ? ? 21(音頻書(shū))
private long mBookUpdateTimeLocal;// 服務(wù)端獲取的書(shū)籍
private int mOpenBookType = -1; // 打開(kāi)書(shū)籍的type 0普通書(shū),1雜志, 2pdf 默認(rèn)-1
書(shū)架全局變量:BookShelfConfig(SharedPreferences)
private static final String IS_LIST_MODE = "is_list_mode";? // 列表模式 1? 還是 grid模式 0
private static final String IS_LOCAL_BOOK_MODE = "is_localbook_mode";? // 本地書(shū)模式 1? 還是 全部書(shū)模式 0
常量:
/**
* 書(shū)架顯示模式
*/
public static final int TYPE_GRID_MODE = 0; //? grid模式
public static final int TYPE_LIST_MODE = 1; // 列表模式
/**
* 書(shū)架狀態(tài)模式
*/
public static final int TYPE_ALL_BOOK_MODE = 0; // 全部書(shū)模式
public static final int TYPE_LOCAL_BOOK_MODE = 1; // 本地書(shū)模式
/**
* 書(shū)架 篩選類(lèi)型
*/
public static final int TYPE_FILTER_ALL = 0; // 所有書(shū)
public static final int TYPE_FILTER_LOCAL = 1; // 本地書(shū)
public static final int TYPE_FILTER_BAOYUE = 2;// 包月
public static final int TYPE_FILTER_GROUP = 3; // 組
public static final int TYPE_FILTER_TITLE_BAOYUE = 4;// 包月TITLE
public static final int TYPE_FILTER_TITLE_GROUP = 5; // 組TITLE
/**
* 是否置頂區(qū)
*/
public static final int TYPE_COMMON = 0;// 非置頂區(qū)
public static final int TYPE_TOP = 1;//? 置頂區(qū)
/**
* 大的類(lèi)型,包月,普通書(shū)
*/
public static final String BOOK_SOURCE_TYPE_BAOYUE = "monthly"; // 包月
public static final String BOOK_SOURCE_TYPE_BOOK = "book";// 書(shū)、組
/**
* 書(shū)的類(lèi)型
*/
public static final int BOOK_SMALL_TYPE_NOT_SYNC_LOCAL = -1; //? 自定義的 未同步過(guò)的本地書(shū)
public static final int BOOK_SMALL_TYPE_ORIGINAL_BOOK = 0;// 原創(chuàng)
public static final int BOOK_SMALL_TYPE_PUBLIC_BOOK = 1;// 出版
public static final int BOOK_SMALL_TYPE_SYNC_LOCAL = 2;//? 同步過(guò)的本地書(shū)
public static final int BOOK_SMALL_TYPE_AUDIO_BOOK = 21;// 音頻書(shū)
/**
* 書(shū)的來(lái)源
*/
public static final int BOOK_TYPE_NORMAL = 0; //? 普通
public static final int BOOK_TYPE_CHINAMOBILE = 7;// 咪咕
public static final int BOOK_TYPE_AUDIO = 21;// 有聲書(shū)
/**
* 角標(biāo)
*/
public static final int BOOK_CORNER_TYPE_NULL = 0;// 沒(méi)有角標(biāo)
public static final int BOOK_CORNER_TYPE_CHANGDU = 1;//限時(shí)暢讀
public static final int BOOK_CORNER_TYPE_JIEXUAN = 2;//? 節(jié)選
public static final int BOOK_CORNER_TYPE_BAOYUE = 3;// 包月
/**
* 書(shū)籍是否完結(jié)? isFinish
*/
public static final int BOOK_END = 1; //完結(jié)
public static final int BOOK_NOT_END = 3; //連載
/**
* 分組操作
*/
public static final int TYPE_GROUP_REMOVE_GROUP = 0; //表示不分組(全部?jī)?nèi)容)
public static final int TYPE_GROUP_RECOMMAND_CREATE_NEW_GROUP = 1;//表示一個(gè)推薦的組,去新建
public static final int TYPE_GROUP_RECOMMAND_MERGE_GROUP = 2;//表示已存在一個(gè)推薦的粗,去合并操作
/**
* 書(shū)架item 長(zhǎng)按操作
*/
public static final int TYPE_LONG_TOP = 1; //置頂
public static final int TYPE_LONG_GROUP = 2; //分組
public static final int TYPE_LONG_BOOK_DETAIL = 3;//書(shū)籍詳情
public static final int TYPE_LONG_BOOK_BAOYUE_DETAIL = 4;//包月詳情
public static final int TYPE_LONG_DOWNLOAD = 5; //下載
public static final int TYPE_LONG_DELETE = 6; //刪除
public static final int TYPE_LONG_EDIT_GROUP_NAME = 7; //編輯組名
public static final int TYPE_LONG_CANCLE_TOP = 8; //取消置頂
public static final int TYPE_LONG_REORDER = 10; //排序
/**
* 書(shū)架item 下載狀態(tài)
*/
public static final int TYPE_ITEM_NEED_DOWNLOAD = 1; //需要下載
public static final int TYPE_ITEM_DOWNLOADING = 2; //正在下載在中
public static final int TYPE_ITEM_STOP_DOWNLOAD = 3;//暫停下載
public static final int TYPE_ITEM_FINISH_DOWNLOAD = 4;//下載完成
/**
* 刪除時(shí)更新數(shù)據(jù)庫(kù)狀態(tài)
*/
public static final int REAL_DELETE = 2; //確實(shí)需要?jiǎng)h除數(shù)據(jù)
public static final int REAL_UPADTE = 1; //只需要更新組狀態(tài)
/**
* 主編推薦
*/
public static final int TYPE_RECOMMEND_BOOK = 1; //主編推薦
public static final int TYPE_NO_RECOMMEND_BOOK = 0; //正常書(shū)