書(shū)架重構(gòu)實(shí)現(xiàn)(初步模塊化探索)

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)行一些初步的模塊化。

之前的工程結(jié)構(gòu)圖

一、客戶(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模塊之間通訊等。

實(shí)現(xiàn)的項(xiàng)目結(jié)構(gòu)圖


? ? ? ? ? 對(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ū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,730評(píng)論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,118評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,873評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,266評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,482評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,846評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,025評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,279評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,684評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,953評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,751評(píng)論 3 394
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,016評(píng)論 2 375